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
    */
    显然对象发生了变化
    
  • 相关阅读:
    为 Jenkins 配置 .NET 持续集成环境
    树莓派连接GPS模块
    杂记
    大型网站架构系列:电商网站架构案例
    我的心博客。
    555555555555111
    powershell 环境变量只有当前会话起作用问题
    powershell 下独立silent 安装 浏览器问题
    python编码格式
    scss教程推荐
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/14916179.html
Copyright © 2011-2022 走看看