在覆盖hashCode之后,toString()为同一对象返回相同的值,但在使用“ ==”之后返回false

问题描述 投票:-1回答:1

您可能知道对象具有某些功能,例如,我们有oracle Documentacion的toString(),我们可以很清楚地知道它返回hashCode()的HexaValuehttps://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#toString()我们还可以使用hashCode()来检查相等性对象(当然实现取决于您)因此,我为我的班级项目实现了实现:

公开课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假

此外,我还尝试通过写在StringPool中的projekt.toString()中的值:

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

根据PoolString,我应该具有相同的引用,但是outPrint为false。

所以此方法无法获得不同的参考值,但是我无法理解为什么?

java string reference tostring hashcode
1个回答
0
投票

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


0
投票

String类只是指向内存中某处的字符串(char)数据的指针。它是一个类,不是像布尔值,字节,字符,short,int,long,float和double这样的原始类型。

因此,比较两个字符串就比较了指针。

您在生成两个字符串:

String string = projekt.toString();
String stringABC = projekt.toString();

所以您现在有2个不同的指针。它们内部具有相同的文本,但是它们在内存中的不同位置。

但是您可以使用对象的equals()方法:

System.out.println(string.equals(stringABC));
© www.soinside.com 2019 - 2024. All rights reserved.