2016-01-26 14 views
0

我剛剛在Java中學習了克隆。有很深的克隆和淺層克隆。我在漫遊ArrayList在對象添加到它時做了什麼。它是否克隆?是否將對象添加到ArrayList克隆?

我用String對象做了一些測試。

String s = new String("hello"); 
ArrayList<String> list = new ArrayList<String>(); 
list.add(s); 
s = s.replace('h','y'); 
System.out.prinln(list.get(0)); 

它打印出「你好」。所以它確實克隆。然後我從個人經歷中記起,當我添加寫入數組的對象時,它不會克隆。當我改變陣列中的一個時,原來的改變也是如此。

我搜索谷歌,不知道,因爲我缺乏搜索技巧,我沒有找到我正在尋找的答案。然後我搜索了StackOverFlow,我再也沒有找到。

那麼ArrayList的處理是什麼?如果這個問題重複,我真的很抱歉,我真的搜查。

有人不明白這個問題: ArrayList clon? (這是我正在尋找答案的主要問題)如果不是這樣,爲什麼String得到克隆?

+3

它doesn't克隆。在這種情況下,你只是注意到'String'是不可變的。 – SomeJavaGuy

+1

因爲字符串是不可變的! – Shriram

+1

字符串不變性。以下是關於這個主題的很好的閱讀:http://stackoverflow.com/questions/1552301/immutability-of-strings-in-java –

回答

0

您可以通過檢查其identityHashCode來驗證操縱列表內容是否無法克隆。它將保持不變。

+0

我可以找出如果有任何對象與此克隆?每個物體都會有所不同嗎? – ossobuko

+1

是的,例如嘗試: System.err.println(System.identityHashCode(s)+「vs」+ System.identityHashCode(s.replace('h','y'))); –

+1

爲了清楚起見,identityHashCode中的差異表示對象是不同的實例,這包括創建新字符串時的克隆場景以及String.replace –

1

您可以修改數組內的對象,並且如果對象是可變的,則更改將保留。 字符串不可修改並且你不能改變它,每當你對一個字符串進行任何函數/操作時,它會返回一個新的字符串對象和結果。

ArrayList不克隆對象,它只是一個對象數組,如果它們是可變的,你可以獲取和修改它們。

如果你需要,你可以使用StringBuilder對象一個可變的字符串:

StringBuilder string = new StringBuilder("Hi!"); 
string.append(" - concat new String"); 
System.out.println(string.toString());