Java 改变一个list 另一个list值也会跟着改变

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的值不会变,懂了吗?

你可能感兴趣的:(Java 改变一个list 另一个list值也会跟着改变)