【问题标题】:Can you override a function from a generically typed object?你能从一个通用类型的对象中重写一个函数吗?
【发布时间】:2022-01-24 03:45:14
【问题描述】:

我有一个 Java 类,它在 HashMap 中存储通用 Object 类型:

private final Map<Object, NetworkMarker> packetMarker = new WeakHashMap<>();

packet 对象非常大,map 的吞吐量非常高,因此单独对数据包进行哈希处理就占用了荒谬的 cpu 周期,我很好奇是否可以将其最小化,或者我只需要更好的硬件。

是否有一种方法可以覆盖 hashCode 函数以使其更高效,尽管它是一个没有包装器的通用 Object 类,或者可能扩展 hashmap 以增强 #get() 方法?或者我忽略的任何其他方法!

干杯!

编辑澄清:packet 对象未键入。它的类型为Object。它是从外部源传入的,所以我无法分配类型。

【问题讨论】:

  • 您应该详细解释一下“packet 对象”。它是什么课?为什么Map 不是Map<Packet, NetworkMarker>?对数据包进行散列处理使其如此昂贵的原因是什么? packet equals 方法是什么样的。我不明白您正在考虑覆盖哪个类的 hashCode
  • packet 对象实际上是一个通用的Object。它是从另一个来源传入的,因此我无法将其分配或强制转换为类型。每种方法都是现货Object#
  • 如果它实际上是一个对象,那么它的 hashCode 实现应该很快。但是你的意思是说它的具体类型是变化的,并且只以 Object 为界,在这种情况下@shmosel 的包装器听起来是一个不错的计划?

标签: java performance hash hashmap


【解决方案1】:

您总是可以将它包装在另一个缓存哈希码的类中:

class CachedHash {
    public final Object cached;
    private Integer hashCode;

    public CachedHash(Object cached) {
        this.cached = cached;
    }

    @Override
    public boolean equals(Object o) {
        return cached.equals(o);
    }

    @Override
    public int hashCode() {
        if (hashCode == null) {
            hashCode = cached.hashCode();
        }
        return hashCode;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多