java - 覆盖 `equals()` 方法在 `HashMap` 中给出意外结果

标签 java scjp

这是 OCJP 6 考试的问题,因此它有意不完全正确(但合法)。

给定代码:

class ToDos {
    String day;

    public ToDos(String d) {
        day = d;
    }

    public boolean equals(Object o) {
        return ((ToDos) o).day == day;
    }

    public int hashCode() { return 9; }
}

public class MapEQ {

    public static void main(String[] args) {
        Map<ToDos, String> map = new HashMap<ToDos, String>();

        ToDos t1 = new ToDos("Monday");
        ToDos t2 = new ToDos("Mond" + "a" + "y");
        ToDos t3 = new ToDos("Tuesday");

        map.put(t1, "a");
        map.put(t2, "b");
        map.put(t3, "c");

        System.out.println(map.size());
    }

}

为什么输出是2?我的意思是,equals 方法没有被正确覆盖,所以 t1.day == t2.day 应该是假的!我错过了什么吗?

最佳答案

这是因为:

"Mond" + "a" + "y"

在编译时被评估为“星期一”,因此在字符串池中只有一个实例。有一个更简单的测试来检查此行为:

System.out.println("Mond" + "a" + "y" == "Monday");  //true

String y = "y";
System.out.println("Mond" + "a" + y == "Monday");  //false

final String y2 = "y";
System.out.println("Mond" + "a" + y2 == "Monday");  //true

上面的示例应该让您大致了解编译器如何处理字符串连接。

为了安全起见,请始终使用:

return ((ToDos) o).day.equals(day);

关于java - 覆盖 `equals()` 方法在 `HashMap` 中给出意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13786850/

相关文章:

java - 将数据从输入扫描仪传递到另一种方法

java - 跨浏览器登录?

java - 无法连接 Spark-Cloudant

java - 有什么方法可以删除 java.io.IOException : Cannot run program "grep": CreateProcess error=2"in windows

当类是泛型时,Java 通配符奇怪的行为

java - 如何从匿名内部类调用特定的父构造函数?

java - SCJP 问题来确定对象何时被垃圾收集?

c# - 如何测试一个矩形是否在另一个矩形中?

java - 覆盖 hashCode() 和 equals() 以将对象存储在 hashMap 中无法正常工作

java - SCJP程序给出输出8 2怎么办?