LinkedIdentityHashSet

2022-09-04 21:58:08

我知道IdentityHashSet(通过Collections#newSetFromMap(Map))LinkedHashSet。但是,我需要的是两者的组合,一个.我无法在网上找到任何现成的解决方案。有人知道如何调整这个吗?LinkedIdentityHashSet

感谢您的建议!


答案 1

那里的实现技术不能很好地结合在一起。 将链接列表添加到地图的入口对象。 使用探测技术,因此避免了任何入口对象。LinkedHashMapIdentityHashMap

有几种方法可以将“标识”特征添加到集合/映射。

  • 强制密钥类型在 and 方法中正确运行。实际上,所有引用类型类型都应该有这个,但没关系。finalequalshashCode
  • 如果无法修改但可以修改类,请添加一个字段,该字段属于一个类,该类包含对要用作键的类型的引用。使用新字段作为键。equalshashCodefinalfinalfinal
  • 将适配器对象存储在集合/映射中。您需要为每次查找创建一个新的适配器实例。它只是有它的 / 方法来调用 / 在原始对象上。equalshashCode==System.identityHashCode

答案 2

一种选择是使用LinkedHashSet和包装器

class LinkedIdentityHashSet<E> extends AbstractSet<E> {
    Set set = new LinkedHashSet();

    static class IdentityWrapper {
        Object obj;

        IdentityWrapper(Object obj) {
            this.obj = obj;
        }

        public boolean equals(Object obj) {
            return this.obj == obj;
        }

        public int hashCode() {
            return System.identityHashCode(obj);
        }
    }

    public boolean add(E e) {
        return set.add(new IdentityWrapper(e));
    }
...