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
    */
    显然对象发生了变化
    
  • 相关阅读:
    Mysql 触发器
    Mysql 的变量
    Mysql 事务
    重置mysql管理员密码
    mysql数据备份
    Mysql的联合查询
    Mysql的存储引擎
    数据库的视图
    数据库子查询
    数据库外键
  • 原文地址:https://www.cnblogs.com/INnoVationv2/p/14916179.html
Copyright © 2011-2022 走看看