簡體   English   中英

如何為不同的HashMap避免大量的關鍵對象

[英]How to avoid of huge amount of key objects for different HashMaps

在我的項目的多個地方,我使用了HashMap。 我的每個HashMap都應該有一個包含以下幾個字段的鍵:

 public Long campaignId;
    public Integer regionId;
    public String posaLang;
    public String audienceCode;
    public String theme;

    public GroupKey(Long campaignId,
                      Integer regionId,
                      String posaLang,
                      String audienceCode,
                      String theme) {

        this.campaignId = campaignId;
        this.regionId = regionId;
        this.posaLang = posaLang;
        this.audienceCode = audienceCode;
        this.theme = theme;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;

        if (o == null || getClass() != o.getClass()) return false;

        AdGroupKey that = (AdGroupKey) o;

        return new EqualsBuilder()
                .append(regionId, that.regionId)
                .append(posaLang, that.posaLang)
                .append(audienceCode, that.audienceCode)
                .append(theme, that.theme)
                .isEquals();
    }

    @Override
    public int hashCode() {
        return new HashCodeBuilder(17, 37)
                .append(regionId)
                .append(posaLang)
                .append(audienceCode)
                .append(theme)
                .toHashCode();
    }
}

它的代碼太多了,對於每個HashMap,我都應該像上面那樣編寫一個密鑰類。 有沒有辦法避免對這些物體產生巨大的影響?

我懷疑您的問題如果標題為“ HashMap中最佳組合鍵的最佳方法”,將會吸引更多的觀點。

有很多選擇可供選擇,對於每種鍵類型使用單獨的類可能是最佳選擇。 它是規范且安全的,因為它可以表示由每個字段中可能值組成的任意組合組成的任何可能值。 為了最大程度地減少空間開銷,請考慮您是否真的需要campaignId作為Long對象,或者僅僅是一個基本的long —換句話說,它可以為null嗎?

您可以將所有字段組合為一個字符串,這樣可以節省空間,因為您隨后將所有字段連續存儲在內存中,而不必使用單獨的引用變量。 但這可能很棘手。 您將使用什么作為字段之間的分隔符? 您確定此定界符永遠不會成為字段的一部分嗎?

您可以像原始選項中那樣分別存儲每個字段,而不必為每種鍵類型編寫一個類。 您需要的是一個收集類,它可以存儲所有字段並提供合適的hashCodeequals方法,這些方法使用這些字段的值。 實際上, List接口提供了此功能。 它的hashCodeequals方法規范正是您所需要的。 它們依次組合hashCode和equals每個字段的方法。

因此,只使用一個List而不是一個類:

List<Object> myKey = Arrays.asList(campaignId, regionId, posaLang, audienceId);
HashMap<List<?>, ValueClass> myMap = new HashMap<>();
myMap.put(myKey, myValue);
myValue = myMap.get(Arrays.asList(campaignId, regionId, posaLang, audienceId));

優點:方便,您不必為每個鍵編寫一個類。

缺點:缺乏類型安全性。 您不能有齊次的列表,因此所有字段都必須是Object類型。 無法防止創建的對象太多或太少或類型錯誤的列表。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM