我对数组列表中的克隆概念感到困惑。 例如:
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