Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 重写hashCode后,toString()返回同一对象的相同值,但使用"==&引用;返回错误_Java_String_Reference_Tostring_Hashcode - Fatal编程技术网

Java 重写hashCode后,toString()返回同一对象的相同值,但使用"==&引用;返回错误

Java 重写hashCode后,toString()返回同一对象的相同值,但使用"==&引用;返回错误,java,string,reference,tostring,hashcode,Java,String,Reference,Tostring,Hashcode,你们可能知道,物体有一些功能, 例如,我们从oracle Documentacion中获得了toString(),默认情况下,我们可以知道它的hashCode()返回值 我们还可以使用hashCode()检查相等对象(当然,实现取决于您) 因此,我为我的类项目进行了实现: public class Projekt { int i; public Projekt(int i) { this.i=i; // TODO Auto-generated c

你们可能知道,物体有一些功能, 例如,我们从oracle Documentacion中获得了toString(),默认情况下,我们可以知道它的hashCode()返回值 我们还可以使用hashCode()检查相等对象(当然,实现取决于您) 因此,我为我的类项目进行了实现:

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为false


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

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

字符串类只是指向内存中某个位置的字符串(char)数据的指针。它是一个类,它不是像布尔、字节、字符、短、int、long、float和double这样的基本类型

所以,比较两个字符串就是比较指针

在中生成两个字符串:

String string = projekt.toString();
String stringABC = projekt.toString();
现在你有两个不同的指针。它们内部有相同的文本,但它们在内存中的位置不同

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

System.out.println(string.equals(stringABC));
根据您的评论:


我从Different comenatry复制了这个:但是为了节省内存,我们使用了StringPool。如果我们有相同的值,refereance也是相同的,它只是用于创建
字符串,而不是通过构造函数。如果我有
String s=新字符串(“a”);字符串s2=新字符串(“a”)我在内存中使用了2个空格,但当我使用
字符串s=“a”;String s2=“a”
我在内存中使用了1个空间。那么这意味着
toString()
返回“newstring()”

你的消息来源应该说:

…它只用于使用字符串文本创建
字符串

这样可能会更清楚,因为有很多方法可以创建新的
String
对象,而无需直接调用构造函数。字符串文字是由
(包括引号)包围的内容,例如
“a”
“b”
“欢迎使用堆栈溢出”

只有字符串literals1被自动池化。您可以通过调用
intern()
手动将字符串放入池中

当您连接两个字符串(例如,
stringA+stringB
)时,通常会创建一个新字符串,如下所述

现在,让我们看看什么是:

类对象的toString方法返回一个字符串,该字符串由 对象作为实例的类的名称,at符号 字符“@”和哈希的无符号十六进制表示形式 对象的代码。换句话说,此方法返回一个等于 价值:

getClass().getName() + '@' + Integer.toHexString(hashCode())
请注意,字符串在这里被连接,因此在这里创建了一个新的字符串对象,从而得到了输出

并回答以下问题:

那么这意味着
toString()
返回“newstring()”

是,但不是直接。编译器将使用
StringBuilder
+
对象中的
+
运算符转换为某些代码(或者更确切地说,“编译器已转换…”,因为
对象
类已编译)。最后,它将调用
StringBuilder.toString
,这将创建一个新的
String
对象



1更准确地说,字符串的常量表达式。

为什么您希望这两个字符串是同一个对象?
==
返回false意味着它不是同一个对象。我从Different Comenary复制了这一点:但为了节省内存,我们使用了StringPool。如果我们有相同的值,则refereance也就是它所使用的相同对象不是通过构造函数创建字符串。如果我有字符串s=new String(“a”);字符串s2=new String(“a”);我在内存中使用了2个空间,但是当我使用字符串s=“a”;字符串s2=“a”时,我在内存中使用了1个空间。所以这意味着toString()返回“new String()”?String String=“a”;String string2=“a”System.out.println(String==string2);输出:true。因为这里的引用是使用StringPool的同一原因字符串。这是我的理解方式,如果我错了,请让我更正。是的,但是toString()方法有点不同,@Sweeper解释了原因。但为了节省内存,我们使用了StringPool。如果我们有相同的值,refereance也一样,它只是用于创建字符串,而不是通过构造函数。如果我有字符串s=新字符串(“a”);字符串s2=新字符串(“a”);我在内存中使用了2个空间,但当我使用字符串s=“a”)时"; String s2=“a”我在内存中使用1个空间。这意味着toString()返回“new String()”?这是我想知道的,其他评论说我写的和我写的一样,但是使用了不同的描述。非常感谢。