关于java基础类型Integer String的clone()

关于基础类型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
*/
显然对象发生了变化
posted @ 2021-06-21 22:26  INnoVation-V2  阅读(274)  评论(0编辑  收藏  举报