Java 由于创建的不同,字符串的行为会有所不同?
首先,我在S.O.和谷歌上都搜索过这个。如果你说这是某处某物的复制品,那么某物真的很难到达 嗯。。。我们知道字符串是对象,必须使用equals进行比较,对吗 那么,请解释一下:Java 由于创建的不同,字符串的行为会有所不同?,java,string,comparison,equals,Java,String,Comparison,Equals,首先,我在S.O.和谷歌上都搜索过这个。如果你说这是某处某物的复制品,那么某物真的很难到达 嗯。。。我们知道字符串是对象,必须使用equals进行比较,对吗 那么,请解释一下: String s1 = new String("string"); String s2 = new String("string"); String s3 = "string"; System.out.println(s1.equals(s2)); // true System.out.println(s1 == s
String s1 = new String("string");
String s2 = new String("string");
String s3 = "string";
System.out.println(s1.equals(s2)); // true
System.out.println(s1 == s2); // false
System.out.println(s1 == "string"); // false
System.out.println(s2 == "string"); // false
System.out.println(s3 == "string"); // true
关于==“string”
输出,为什么只有最后一个输出为“true”
当它们被创建时,它们不都是字符串吗?现在我的第三根弦是丑小鸭吗。。。更糟的是:如果我使用的是外来字符串。。。可能不是我想的那根绳子?!(请注意,s3前面有String
,而不是一些原语。)
…我很确定s3里面有个对象
换句话说,像这样声明字符串有什么区别:
String s1 = new String("string");
String s3 = "string";
还有一个是这样的:
String s1 = new String("string");
String s3 = "string";
?编译器将搜索硬编码的文本,如“字符串”,并用相同的引用对象替换它们
其他两个对象在
equals()
上应该返回true,但它们完全是不同的对象,因为您使用的是新运算符。可以插入String
类型的一些值,也就是说,具有相同值的String
的多个实例可以指向同一个对象。对于这种情况,==
将正常工作,尽管您不能依赖此行为,除非您显式调用intern()
您可以尝试以下代码段,它将始终打印true
:
String s1 = new String("a").intern();
String s2 = "a".intern();
System.out.println(s1 == s2);
当您执行
strings1=新字符串(“字符串”)
,它在内存中创建一个新的字符串
对象,并通过s1
保存引用。类似地,通过String s2=新字符串(“字符串”)
,您可以通过s2
获得另一个字符串对象引用
=
运算符比较对象引用,因此s1==s2
为false,因为它们是不同的字符串对象
当你说strings3=“String”代码>,它在内部池中创建一个字符串常量文本对象(String类维护内部池),并将引用分配给s3
更多详细信息请参见以下规范:
所有文本字符串和字符串值常量表达式都被插入。字符串文本在
现在,当您说,s3==“string”
,“string”
引用的是与s3
相同的字符串对象引用(Java在创建匿名常量文本时进行了优化,因此不再创建相同的值文本)。因此,此比较结果为true
与s1
和s2
不同,它们都引用内存中的显式字符串对象。我希望您了解java中的SCP(字符串常量池)。当您使用new创建字符串时,它将创建新引用,就像普通java对象一样。。。但当您声明like s3=“string”时,它只会在SCP中为相同的值字符串创建一次引用。这意味着,如果您创建任何其他like s5=“string”将指向相同的引用,它将不会创建新的引用。
==将只检查引用,但.equals()方法检查值。在您的程序中,“string”字符串值已经存储在scp区域中,所以当您检查s3==“string”时,它将返回true。它不会创建新的引用。如果你想得到更多的clarety post评论…Re:“我在S.O.和Google上都搜索过了”:如果你在搜索中添加单词intern
,或者只是在Javadoc中查找String.intern
,你会更幸运。很好。这意味着我必须知道这个实习生的存在,我不知道。你右边的相关问题意味着你真的没有足够努力地搜索。@UndeoV.E:是的,我没有批评。有时候,很难找到一个你或多或少都不知道的答案。@EJP谢谢,这很有帮助,但它很难重复。虽然经过一些编辑后,OP也有了一些相似之处,但主要的问题是完全相反的。Re:“如果它们经常发生”:不正确。所有字符串文本(和其他编译时常量字符串表达式)都会发生内部调用,而不仅仅是经常发生的字符串。看,是我的错,谢谢你的提示!嗯,Java使用了很多“想法”,我们通常不会想象它是在后台发生的。对。这一切都是为了可能的优化。