關於java基礎型別Integer String的clone()
阿新 • • 發佈:2021-06-21
關於基礎型別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 */ 顯然物件發生了變化