关于基础类型Integer String的clone()
众所周知,Java容器类中的clone为浅复制,但当我们内部存储Integer类型对象时,似乎好像变成了深复制,类似如下代码
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
List<Integer> list2 = (List<Integer>) list.clone();
list2.set(0, 888);
System.out.println(list);
System.out.println(list2);
}
/*
预期结果[888, 2][888, 2]
实际结果[1, 2][888, 2]
*/
原因
所有的基础类型,类似于Integer,String等,都是线程安全不可变类
当我们执行
Integer x=new Integer(12);
时,jvm内部创建一个Integer对象,但当我们进行修改时,jvm并不是直接对原有对象进行修改,而是创建一个新的Integer对象存储新值,然后返回这个新值,因此当我们对集合内部的Integer对象修改值时,实际上其指向的对象已经改变,导致发生了类似于深复制的现象
Integer x = new Integer(888);
System.out.println(System.identityHashCode(x));
x -= 10;
System.out.println(System.identityHashCode(x));
/*
结果
488970385
1209271652
*/
显然对象发生了变化