1. 程式人生 > 其它 >關於java基礎型別Integer String的clone()

關於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
*/
顯然物件發生了變化