1.当list包普通数据类型对象时,比如:Integer,String...... and so on
List list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(i);
}
List list1 = new ArrayList<>();
list1.addAll(list);
System.out.println("before---> list:" + JSON.toJSONString(list) + " list1:" + JSON.toJSONString(list1));
list.set(0, 99);
list.set(1, 99);
System.out.println("after---> list:" + JSON.toJSONString(list) + " list1:" + JSON.toJSONString(list1));
输出内容为:
before---> list:[0,1,2,3,4] list1:[0,1,2,3,4]
after---> list:[99,99,2,3,4] list1:[0,1,2,3,4]
可以看到list里面的值改变了,但是list1里面的值没改变
2.当list包较为复杂类型对象时,比如:自定义一个bean
public class Point {
public int x;
public int y;
public Point() {}
public Point(int x, int y) {
this.x = x;
this.y = y;
}
同样的代码数据类型改下,又会有什么效果呢
List list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(new Point(i, i));
}
List list1 = new ArrayList<>();
list1.addAll(list);
System.out.println("before---> list:" + JSON.toJSONString(list) + " list1:" + JSON.toJSONString(list1));
list.get(0).x = 99;
list.get(0).y = 99;
list.get(1).x = 99;
list.get(1).y = 99;
System.out.println("after---> list:" + JSON.toJSONString(list) + " list1:" + JSON.toJSONString(list1));
输出结果为:
before---> list:[{"x":0,"y":0},{"x":1,"y":1},{"x":2,"y":2},{"x":3,"y":3},{"x":4,"y":4}] list1:[{"x":0,"y":0},{"x":1,"y":1},{"x":2,"y":2},{"x":3,"y":3},{"x":4,"y":4}]
after---> list:[{"x":99,"y":99},{"x":99,"y":99},{"x":2,"y":2},{"x":3,"y":3},{"x":4,"y":4}] list1:[{"x":99,"y":99},{"x":99,"y":99},{"x":2,"y":2},{"x":3,"y":3},{"x":4,"y":4}]
可以看到list值改变了,list1的值也会跟着改变,why?
实际上list1.addAll(list)的时候 list1里面包含的对象指向地址和list所值是一样的,改变list,同样改变list1,但是为什么步骤1里面的不会改变呢?实际基础数据类型会默认new出来一个,看下面这段代码:
List list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add(new Point(i, i));
}
List list1 = new ArrayList<>();
list1.addAll(list);
System.out.println("before---> list:" + JSON.toJSONString(list) + " list1:" + JSON.toJSONString(list1));
list.set(0,new Point(99,99));
list.set(1,new Point(99,99));
System.out.println("after---> list:" + JSON.toJSONString(list) + " list1:" + JSON.toJSONString(list1));
输出结果为:
before---> list:[{"x":0,"y":0},{"x":1,"y":1},{"x":2,"y":2},{"x":3,"y":3},{"x":4,"y":4}] list1:[{"x":0,"y":0},{"x":1,"y":1},{"x":2,"y":2},{"x":3,"y":3},{"x":4,"y":4}]
after---> list:[{"x":99,"y":99},{"x":99,"y":99},{"x":2,"y":2},{"x":3,"y":3},{"x":4,"y":4}] list1:[{"x":0,"y":0},{"x":1,"y":1},{"x":2,"y":2},{"x":3,"y":3},{"x":4,"y":4}]
发现list值改变了,list1的值不会变,懂了吗?