2015-08-26 48 views
-2

我在嘗試創建HashSet時遇到問題。在我的代碼中,我創建了43個不同的HashSet,其中1 - 138個條目沒有任何問題。當我嘗試用13個條目「JAVA」創建我的第44個HashSet時,請做一些奇怪的事情!HashMap索引衝突,同時rezise

添加最後一個「新」條目時。 HashMap.transfer(Entry [] newTable)給我的「新」和「舊」條目相同的索引號。之後,我的新條目被舊條目覆蓋。這裏有人已經面臨同樣的問題嗎?

嗯,我使用一個HashSet:

Set<BaseConfigSet> baseConfigSets = new HashSet<BaseConfigSet>(); 
     BaseConfigSet baseConfigSet = null; 
... 
    baseConfigSet = new BaseConfigSet(next.getBaseConfigId(), interval, next.getValue(), next.getAccountId(), 
           Section.forString(baseConfig.getSection()), baseConfig.getName(), 
           baseConfig.getDescription(), DataType.forString(baseConfig.getDataType())); 

         baseConfigSets.add(baseConfigSet); 

BaseConfigSet使用龍目島annoations產生類似的hashCode(一些代碼),等於()...我的哈希包含一個 「baseConfigId」 int和「間隔」爲org.joda.time.Interval:

@Getter 
     @EqualsAndHashCode(of = { "baseConfigId", "interval" }) 
     @ToString(of={"baseConfigId", "value"}) 
     public static class BaseConfigSet { 

      private Integer  baseConfigId; 

      private Interval interval; 

      @Setter 
      private String  value; 

      private Integer  accountId; 

      private Section  section; 

      private String  sectionName; 

      private String  description; 

      private DataType dataType; 
... 
+1

代碼和錯誤日誌plz – Kun

+1

如果您不添加任何代碼,我們真的幫不了你。 – Manu

+0

究竟是什麼問題?當您爲現有密鑰添加新值時,HashMaps *預計*僅保留最後一個值。除非我們看到代碼,否則我們無法真正理解什麼(如果有的話)出錯 – vefthym

回答

2

這種問題很常見,如果你已經變異了一套地圖或元素的關鍵。在調整大小之後,似乎是兩個鍵/元素變成了一個,因爲只有在這個集合「意識到」你修改了這個之後。

解決方案是隻使用不可變的鍵/元素,或者您必須非常小心以確保在添加鍵/元素後不修改鍵/元素。注意:您添加到集合的所有內容都是您添加的對象的參考。這意味着如果在添加對象後修改對象,它也會在集合中出現。如果你使用一個集合,假設你的鍵/元素不會改變,但你修改它們,你將會損壞集合。這發生在地圖,集合和PriorityQueue中。

+1

實際上關鍵不需要完全不可變,哈希集合的唯一需求是'hashCode()'和'equals()'的冪等性(如果關鍵字沒有實現'Comparable' )。 –