Java 两个字符串语句之间的差异

Java 两个字符串语句之间的差异,java,Java,这两种说法到底有什么区别 String s1="abc"; String s2=new String("abc"); 据我所知,第一条语句将在字符串池中创建一个对象,即s1将对其进行冻结。 在第二条语句中,它将创建两个对象,因为我使用了new关键字,s2将引用字符串池中的对象 现在,如果我一个接一个地执行这两条语句,因为第一条语句的对象“abc”将在字符串池中,随着第二条语句的执行,s2将引用在字符串池中的对象。如果我执行s1==s2,它应该返回true,但返回false 您能解释一下原因吗?

这两种说法到底有什么区别

String s1="abc";
String s2=new String("abc");
据我所知,第一条语句将在字符串池中创建一个对象,即s1将对其进行冻结。 在第二条语句中,它将创建两个对象,因为我使用了new关键字,s2将引用字符串池中的对象

现在,如果我一个接一个地执行这两条语句,因为第一条语句的对象“abc”将在字符串池中,随着第二条语句的执行,s2将引用在字符串池中的对象。如果我执行s1==s2,它应该返回true,但返回false


您能解释一下原因吗?

您正在创建两个不同的对象。s1有自己的内存来保存其参考地址。s2也一样。虽然这两个对象都指向字符串池中的同一个字符串,但对象本身是不同的。因此,s1==s2将失败


但是,s1.equals(s2)将起作用,因为您正在比较字符串内容

事实是
string s1=“abc”
在字符串池中分配字符串,而字符串池是保存不可变字符串的特殊位置。您不能直接修改“abc”,只能修改指向它的引用(
s1

在第二种情况下,
strings2=newstring(“abc”)
您正在分配一个真实的String对象,该对象内部有一个存储字符串数据的
char[]
缓冲区。它和第一个一样是不可变的,但它是堆上的一个对象


在比较
s1==s2
时,由于比较引用,它们是不同的,因为其中一个指向字符串池中的字符串(我实际上不确定是否创建了包装器对象或使用了对池中对象的直接引用),而第二个指向显式创建的对象(它包装了一个存储数据的
char[]
缓冲区)。

这是:链接不包含我要查找的内容。@user728907链接准确地回答了您的问题如果我错了,请纠正我,但是如果我们不重写equals方法,它的默认行为是==那么为什么它会返回true。(不知道这是否是一个逻辑问题)等于的字符串实现覆盖Object.equals。它检查字符串的内容,而不是对象本身。第二条语句将创建两个对象,一个在实堆中,另一个在字符串常量池中……如果我错了,请纠正我,因为abc已经存在(由于字符串s1=“abc”)s2只会引用已经存在的字符串…所以基本上s1和s2都会引用两个相同的字符串…请纠正我哪里缺少点否,
s2
引用了一个对象,它引用了字符串池中的字符串。而不是直接引用字符串。所以我明白了,这意味着s1引用了字符串池中的abc,而s2引用了一个在字符串池中复制字符串的对象…可以吗?刚刚检查了openjdk的实现:
string(string str)
构造函数甚至创建了一个内部缓冲区
char[]
,它在其中复制了传递的字符串,所以它既不引用字符串池,也是一个完全不同的对象。()哦,谢谢。它真的帮助了我。现在我可以继续收藏了