java - 为什么 Java 使用 'equals' 而不是 '==' 来检查对象在 Map 中的存在?

标签 java equals

<分区>

假设我想在 Map 中放置一个键及其值。

我相信这就是 Java 所做的:

  1. 获取key的Hashcode,检查map中是否有相同hashcode的key。

  2. 如果不存在具有相同Hashcode的键,则可以将键放入Map中。

  3. 如果有相同Hashcode的key,则用equals判断是否可以放入Map。

我的问题是为什么在这个过程中不使用==而不是equals

最佳答案

按照您的建议进行操作会破坏 equals/hashCode 串联的整个概念。 equalshashCode 都将变得毫无用处,甚至不应该存在。

Java 允许程序员为他的类定义相等集;如果他不想这样做,他可以简单地选择不覆盖 equalshashCode — 并以您建议的语义结束。

举一个具体的例子,根据您的提议,这将在 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/

相关文章:

java - 列表/哈希集中使用的自定义类

Java ArrayList不使用重写equals(Object o)方法进行比较

java - 无法将对象添加到 TreeSet

java - 尝试调用不存在的方法。超导系统

java - 如何确定 FileInputStream 指向与 FileOutputStream 相同的文件?

java - Java 类和包的设计

java - 两个矩阵之间的行相等

java - 使用java中的数据报将视频/音频从客户端发送到服务器?

java - 更正方法的返回类型

java - TreeSet 和 equals 函数