默认情况下,Java类具有引用语义;即使同一类的两个实例的所有字段都具有相同的值,也被认为是不同的。
有时您想要的是值语义,例如String
,BigInteger
。有一种简单的标准方式来安排此操作:覆盖equals
和hashCode
以在适当的字段上工作。
如果要一个在某些上下文中表现出引用语义而在其他上下文中表现出语义的类怎么办? (我在这里考虑的是一个代表用于编译器中间代码的SSA指令的类。)一种实现此目的的方法是按值与equals
和按引用与==
比较。
但是,如果要将此类对象存储在两个不同的哈希表中,一个按引用,另一个按值存储,该怎么办?据我了解,HashMap
始终使用覆盖的按值equals
和hashCode
方法(如果存在)。
有没有办法告诉HashMap
,在这种特殊情况下,您想通过引用比较对象?
答案 0 :(得分:2)
是否可以告诉HashMap在这种情况下要通过引用比较对象?
否,但是有IdentityHashMap:
此类通过哈希表实现Map接口,在比较键(和值)时使用引用相等代替对象相等
但是,在Javadoc中有详细的使用注意事项。