首页 > 解决方案 > 覆盖 hashCode 后,toString() 为同一个对象返回相同的值,但使用 "==" 后返回 false

问题描述

您可能知道 Object 有一些功能,例如我们有来自 oracle Documentacion 的 toString() 我们可以知道默认情况下它返回 hashCode() 的 HexValue https://docs.oracle.com/javase/7/docs/api/java /lang/Object.html#toString() 我们也可以使用 hashCode() 来检查相等对象(当然实现取决于你)所以我为我的 Class Projekt 做了实现:

public class Projekt {

    int i;
    public Projekt(int i) {
        this.i=i;
        // TODO Auto-generated constructor stub
    }
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + i;
        return result;
    }   
}

测试代码:

Projekt projekt = new Projekt(1);
System.out.println(projekt.toString());
System.out.println(projekt.toString() == projekt.toString());

输出:

Projekt@20
false

我还尝试通过写入 StringPool 中的 projekt.toString() 来获取内部值:

    String string = projekt.toString();
    String stringABC = projekt.toString();
    System.out.println(string == stringABC);

根据 PoolString 我应该有相同的参考,但 outPrint 是假的。

所以这个方法返回不同的参考值,但我不明白为什么?

标签: javastringreferencetostringhashcode

解决方案


这是因为“toString()”方法返回一个字符串。所以每次调用toString()它都会返回一个新的引用,因为字符串是不可变的(即使它们是相同的文本)


推荐阅读