<分区>
假设我想在 Map 中放置一个键及其值。
我相信这就是 Java 所做的:
获取key的Hashcode,检查map中是否有相同hashcode的key。
如果不存在具有相同Hashcode的键,则可以将键放入Map中。
如果有相同Hashcode的key,则用equals判断是否可以放入Map。
我的问题是为什么在这个过程中不使用==
而不是equals
?
<分区>
假设我想在 Map 中放置一个键及其值。
我相信这就是 Java 所做的:
获取key的Hashcode,检查map中是否有相同hashcode的key。
如果不存在具有相同Hashcode的键,则可以将键放入Map中。
如果有相同Hashcode的key,则用equals判断是否可以放入Map。
我的问题是为什么在这个过程中不使用==
而不是equals
?
最佳答案
按照您的建议进行操作会破坏 equals
/hashCode
串联的整个概念。 equals
和 hashCode
都将变得毫无用处,甚至不应该存在。
Java 允许程序员为他的类定义相等集;如果他不想这样做,他可以简单地选择不覆盖 equals
和 hashCode
— 并以您建议的语义结束。
举一个具体的例子,根据您的提议,这将在 map 中创建两个单独的条目:
Map<Integer, String> map = new HashMap<>();
map.put(10_000, "a");
map.put(10_000, "a");
那是因为文字 10_000 每次都会自动装箱到 Integer
的新实例中,根据您的语义,这是两个单独的键。然后,声明
System.out.println(map.get(10_000));
将打印 null
,因为您当然要使用第三个 键来获取。实际上不可能通过键检索任何映射值。
关于java - 为什么 Java 使用 'equals' 而不是 '==' 来检查对象在 Map 中的存在?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18032172/