繁体   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