Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 由于创建的不同,字符串的行为会有所不同?_Java_String_Comparison_Equals - Fatal编程技术网

Java 由于创建的不同,字符串的行为会有所不同?

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

首先,我在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 == 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使用了很多“想法”,我们通常不会想象它是在后台发生的。对。这一切都是为了可能的优化。