ArrayList.clone()方法在Java中如何工作?

我对数组列表中的克隆概念感到困惑。 例如:

Balloon green = new Balloon("Green",new Address("greenState","greencity"));
Balloon green2 = (Balloon)green.clone();
green.setColor("NewGreen");
System.out.println(green);
System.out.println(green2);//color not affected in copy as color is of String type.
                           //Immutable objects are not shallow copied.
green.getaddress().state="helloState";
System.out.println(green);
System.out.println(green2);//Address does get affected

输出:-

  

气球[color = NewGreen地址=地址{state =   greenState,city = greencity}]
气球[color =绿色Address =地址   {state = greenState,city = greencity}]
气球[color = NewGreen   地址=地址{州= helloState,城市= greencity}]   
气球[颜色=绿色地址=地址{州= helloState,城市=   greencity}]


这很清楚。但是现在让我们获取数组列表。

Balloon red = new Balloon("Red",new Address("redState","redCity")); 
Balloon blue = new Balloon("Blue",new Address("blueState","blueCity"));
Balloon yellow = new Balloon("yellow",new Address("yellowState","yellowCity"));

ArrayList<Balloon> list = new ArrayList<>();
list.add(red);
list.add(blue);
list.add(yellow);
ArrayList<Balloon> listCopy = (ArrayList<Balloon>)list.clone();
Balloon green = new Balloon("Green","greencity"));

list.get(1).setColor("color");

list.add(green);
System.out.println(list);
System.out.println(listCopy);

输出:-

  

[气球[颜色=红色地址=地址{州= redState,城市= redCity}],气球[颜色=颜色地址=地址{州= blueState,城市= blueCity}],气球[颜色=黄色地址=地址{state = yellowState,city = yellowCity}],Balloon [color = Green Address = Address {state = greenState,city = greencity}]],

[Balloon [color = Red Address = Address {state = redState,城市= redCity}],Balloon [颜色=颜色地址=地址{state = blueState,城市= blueCity}],Balloon [color = yellow地址=地址{state = yellowState,城市= yellowCity}]]

因此,在上面的输出中,更改列表中气球的颜色也会影响副本。但是添加新元素不会反映在副本中。

有人可以解释吗?


根据luk2302的回答,以下可视化解释了发生的情况:

    list   object  listCopy
     |___  red   ___|
     |___  blue  ___|
     |___ yellow ___|


     list.add(green);
    list  object  listCopy
     |___  red   ___|
     |___  blue  ___|
     |___ yellow ___|
     |___ green 


     list.remove(blue);
    list  object  listCopy
     |___  red   ___|
           blue  ___|
     |___ yellow ___|
     |___ green 
pcccainao 回答:ArrayList.clone()方法在Java中如何工作?

Traceback (most recent call last): File "/usr/local/bin/pip",line 9,in <module> load_entry_point('pip==7.1.0','console_scripts','pip')() File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py",line 558,in load_entry_point return get_distribution(dist).load_entry_point(group,name) File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py",line 2682,in load_entry_point return ep.load() File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py",line 2355,in load return self.resolve() File "/usr/local/lib/python2.7/site-packages/pkg_resources/__init__.py",line 2365,in resolve raise ImportError(str(exc)) ImportError: 'module' object has no attribute 'main' 上的

clone不会执行深度复制 /深度克隆,实际上它会执行 shallow ,这意味着不复制其中包含的内容,它只是复制对这些元素的引用。
您仍然分别只有一个绿色,蓝色和黄色气球。您有一个引用四个气球的列表,一个引用三个气球的列表,这些列表在它们包含多少元素方面彼此独立。但是他们当前指向 的实际气球会被共享。

本文链接:https://www.f2er.com/2997881.html

大家都在问