Java 重写hashCode后,toString()返回同一对象的相同值,但使用"==&引用;返回错误
你们可能知道,物体有一些功能, 例如,我们从oracle Documentacion中获得了toString(),默认情况下,我们可以知道它的hashCode()返回值 我们还可以使用hashCode()检查相等对象(当然,实现取决于您) 因此,我为我的类项目进行了实现: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
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()”?这是我想知道的,其他评论说我写的和我写的一样,但是使用了不同的描述。非常感谢。