2016-02-16 45 views
1

我對Java比較陌生,對以下事情感到困惑:我通常在設置其內容之前將對象添加到ArrayList。即,在HashSet/HashMap中改變對象的hashCode

List<Bla> list = new ArrayList<>(); 
Bla bla = new Bla(); 
list.add(bla); 
bla.setContent(); // content influences hashCode 

這種方法很好用。我擔心這種方法在與HashSet s或HashMap s一起使用時是否會給我帶來麻煩。內部哈希表在添加對象時設置。將對象添加到HashSetHashMap(及其hashCode更改)後調用setContent()會發生什麼情況?

我應該完全設置(的hashCode影響)添加/投入HashSet S或HashMap小號之前內容?通常建議在添加對象之前完成構建對象?

非常感謝您的見解。

+0

如果您可以使用映射 map = new HashMap <>()',那麼您將使用字符串標識符作爲映射鍵,即使這些值隨後發生更改,也不應該有問題。 –

回答

4

如果在將對象添加到HashSet或HashMap(及其hashCode更改)後調用setContent()會發生什麼?

災難。

在添加/放入HashSets或HashMaps之前,我應該完全設置(hashCode影響)內容嗎?通常建議在添加對象之前完成構建對象?

是。

文檔的相關線路是java.util.Set

注意:如果使用可變對象作爲一組元素大,一定要小心。 如果對象的值以影響等於比較的方式更改,而對象是集合中的元素,則不會指定集合的​​行爲。這種禁令的一個特例是,它不允許一個集合包含它自己作爲一個元素。

一般來說,這種錯誤會表現爲元素既是「in」又是「not in」你的集合,不同的方法不一致。你可能會很幸運,你的元素似乎仍然在收藏中,或者他們可能不會;這可能會隨機發生。

這是很多原因之一,它是大多數物體不可變的絕佳實踐 - 完全不可能在施工後首先進行修改。