zoukankan      html  css  js  c++  java
  • 关于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
    */
    显然对象发生了变化
    
  • 相关阅读:
    hiho150周
    hdu1011
    hiho1055/hdu1561
    bat脚本启动exe并打开文件后退出 + 中文乱码
    hiho1080
    hiho1079
    java异常处理——基础篇
    找不到要编译的文件——path环境变量配置
    MVC——studying
    轻松搞定EasyUI
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/14916179.html
Copyright © 2011-2022 走看看