Java 什么时候使用接口作为键类型对HashMaps有意义?

Java 什么时候使用接口作为键类型对HashMaps有意义?,java,Java,在我看来,任何我使用键类型的接口实例化一个键类型的场景都会与映射的思想背道而驰。以以下为例: HashMap<MyInterface, Integer> map = new HashMap<MyInterface, Integer>(); HashMap map=newhashmap(); 如果我将两个不同的MyInterface实现的对象放入映射中,那么它们将各自运行hashCode()实现,并且HashMap的整个底层逻辑不再有意义。所以我的问题是,在HashMa

在我看来,任何我使用键类型的接口实例化一个键类型的场景都会与映射的思想背道而驰。以以下为例:

HashMap<MyInterface, Integer> map = new HashMap<MyInterface, Integer>();
HashMap map=newhashmap();
如果我将两个不同的
MyInterface
实现的对象放入映射中,那么它们将各自运行
hashCode()
实现,并且
HashMap
的整个底层逻辑不再有意义。所以我的问题是,在
HashMaps
中使用接口作为键是否有合适的时机

它们都将在自己的hashCode()实现上运行,HashMap的整个底层逻辑不再有意义

我猜你的意思是散列碰撞。哈希冲突不会损坏哈希映射。在java中,您需要为哈希映射正确地实现“equals”和“hashCode”来解析密钥

那么:

Map<Connection,AtomicInteger> outstandingQueries = new HashMap<>();
Map outstandingquerys=newhashmap();

java.sql.Connection
是一个接口,这个
Map
很有意义。
equals
hashCode
的实现仍然可以区分不同类型的对象。

我想你有点误解了
HashMap
的工作原理。只要您输入的密钥遵守
hashCode()
的一般合同,不同的实现就不会有问题。如果是这种情况,您将无法使用
对象
键,事实上,原始类型
HashMap
s根本不起作用。对于第二个问题,如果希望密钥属于特定类型,但不关心该类型的具体实现,则可以使用密钥接口
hashCode()
与此无关。这可能会对您有所帮助。使用接口时,我主要关心的是键应该是不可变的对象,而使用接口时,您将无法控制确保键实际上是不可变的。在
hashCode()
中使用的实例字段不能更改。这意味着每次生成一致的哈希代码都应该是不可变的<代码>枚举作为键将很好。这可能对你有帮助