Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.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 - Fatal编程技术网

Java 如果我检查字符串的引用,有人能帮我吗?那么确切的答案是什么?为什么?

Java 如果我检查字符串的引用,有人能帮我吗?那么确切的答案是什么?为什么?,java,string,Java,String,如果我正在检查字符串的引用,那么确切的答案是什么?为什么 String s = "java"; String s1 = "world"; String s2 = "javaworld"; String s3 = s.concat(s1); String s4 = s+"world"; String s5 = "java"+"world"; 为什么它给出true和false,即使s2,s3,s4,s5的哈希代码相同 Boolean b = s2==s3; //'it

如果我正在检查
字符串的引用,那么确切的答案是什么?为什么

String s = "java"; 
String s1 = "world";   
String s2 = "javaworld";  
String s3 = s.concat(s1); 
String s4 = s+"world";    
String s5 = "java"+"world"; 
为什么它给出true和false,即使
s2
s3
s4
s5
的哈希代码相同

Boolean b  = s2==s3;   //'it gives false'
Boolean b1 = s3==s4;   //'it gives false'
Boolean b2 = s2==s4;   //'it gives false'
Boolean b3 = s2==s5;'  //'it gives true'
为什么它给出true和false,即使hashcode对于 s2、s3、s4、s5

hashCode()
equals()
被String类重写,以确保具有相同值的两个不同的字符串相等。它们是不一样的,但它们是相等的。 为每个字符串尝试
System.identityHashCode()
,并查看实际的哈希代码(未被覆盖)


s2==s5
true
,因为编译器将“java”+“world”更改为一个字符串“javaworld”。

这是因为在java中插入字符串

我将尝试用一个更简单的例子来解释这一点。如果你需要详细说明,请告诉我

String a = "hello";  // "hello" created in object pool
String b = "hello";  // "hello" found in object pool, b references the same string object
System.out.println(a == b);  // prints true
这是因为当您为字符串分配一个文本时,“hello”存储在字符串文本池中。无论何时使用文字“hello”,它都指向池中的同一位置。但是,如果使用构造函数,则会得到false,因为字符串对象将具有不同的内存地址

比较字符串的“更安全”方法是使用
equals()
方法。如果您希望避免发生实习,请不要像这样初始化字符串
string a=“hello”,执行此操作
String a=新字符串(“hello”)

第二种方法强制创建新的字符串对象

另一张纸条。使用构造函数确实可以确保进行两个单独的声明。因此,现在池中有两个单独的对象,它们包含字符串“hello”,但是调用该函数可以确保池堆栈中只有一个“hello”副本,并且两个对象都指向它。因此,同样,相等性检查将产生true


另一张小纸条。本部分涉及使用
.equals()
等,over==。当然,实习后,==比equals()快[因为您在==vs中检查指针引用,而在
.equals()
]中比较基于字符的字符串]。所以,如果需要速度,可以通过引用比较字符串(=比等于快)(不过实习需要时间)。显然,这有多个副作用,这可能不在本文的范围之内

相等运算符检查所比较的对象引用是否引用相同的对象或文字

现在,JavaVM使用一个用于字符串文本的池,并将其用于文本之间的比较。因此,对文本(如plus)的直接操作将导致字符串文本,并且它们的任何实例都引用相同的文本,从某种意义上讲,编译器认为它是大约相同的文本:

“foo”+“bar”==“foobar”//true

但是,如果应用生成新
String
对象的操作(例如
String.concat
),则会产生不同的
String
对象:

“foo”.concat(“bar”)==“foobar”//false,对象隐式与文本比较

建议您,如果要比较两个字符串的值,请使用
String.equals
方法:


“foo.concat(“bar”).equals(“foobar”)//true

检查等式do str1.equals(str2)。重新打开:给folk更多的时间来查找目标更明确的副本。请参阅可能有更好的副本:一个涉及编译时可计算常量表达式、字符串内接、,和参考comparisons@TheLostMind关于字符串比较有很多问题,比如or,所以很难理解为什么这个主题仍然有新的问题,为什么他们仍然得到支持(这个问题如何显示任何研究?)。你能提供一些参考说明他们将转换为“javaworld”吗在编译时。引用像java文档、oracle文档或任何我们可以信任的东西。@PyThon-使用
javap-v className
看看使用了什么值:)我想这是最值得信任的一个:)谢谢