在Java中维护一组不同的对象

时间:2011-04-15 03:56:25

标签: java set identity equality

我正在尝试在内存受限的环境中实现Map。地图的值类型我期望有许多重复(即不仅有许多x和y使得x.equals(y),但许多x和y使得x == y)。因此,我想将这些指针保存在一个小数组中(通常情况下,少于几十个条目),并使用一个从字节数组中膨胀的整数对其进行索引;通常这会带来可观的节省。

但是,这需要通过某种方式来跟踪不同的引用。我可以在一些列表中跟踪它们,并在每次添加新值时对其进行线性搜索,但随后地图将不会扩展到超过几百个不同的值(并且,即使很多不同的值价值观并不常见,这并非不可能)。这种映射对于内部Java类来说应该很容易实现,因为它只需要进行指针比较,但是这个接口似乎没有暴露(实际上,因为默认的Object hashCode方法只返回底层指针)大多数实现,我处于一个具有讽刺意义的位置,即由实现hashCode的用户造成Map实施者的伤害。)

有没有办法解决这种行为?

2 个答案:

答案 0 :(得分:2)

您是否在寻找java.lang.System.identityHashCode(Object)==运营商?

答案 1 :(得分:0)

作为替代方案,您可以考虑以下事项:

如果您有一个地图,其中有很多dublicate值(其中entry1.getValue() == entry2.getValue()),那么您可以使用当前值作为键,并将当前键指向内存中的同一对象作为物品清单。

Map<SomeType1, List<SomeType2> map = new IdentityHashMap<SomeType1, List<SIneType2>>();