我在接受采访时被问到这个问题,我说两者都会回复。 但是当我划过它时 一个是真的其他是假的
任何人都可以解释一下吗?
String s1 = "H";
String s2 = "e";
String s3 = s1+s2;
String s4 = "He";
System.out.println(s3 == s4);//false
String s5="h";
String s6="h";
System.out.println(s5 == s6);//true
答案 0 :(得分:0)
需要使用
进行字符串比较string.equals function ==比较引用。
由于“h”是常数,s5 == s6返回true
答案 1 :(得分:0)
我怀疑答案是正在使用字符串池,因为字符串经常被重用,它们有时被分配到同一块内存中。因此,在初始化时为s5
和s6
分配相同的值将为它们分配相同的地址,而将字符串指定为另外两个字符串的串联将始终生成新地址。
答案 2 :(得分:0)
String s3 = s1+s2;
该字符串在运行时实现,并在堆中创建了该引用。
当我们用(+)运算符连接字符串时,JVM返回新的StringBuilder(string...).toString()
第二种情况
String s5="h";
String s6="h";
s5和s6都在编译时解析并指向相同的引用((常量池))。
答案 3 :(得分:0)
使用String.equals(String other)
函数比较字符串,而不是==
运算符。
该函数检查字符串的实际内容,==
运算符检查对象的引用是否相等。请注意,字符串常量通常是" interned"这样两个具有相同值的常数实际上可以与==
进行比较,但最好不要依赖它。
答案 4 :(得分:0)
" =="如果对象地址相同,则operator返回true。在编译时,所有相同的 literal 字符串将减少为相同的String对象。因此:
String s1 = "A";
String s2 = "A"; // s1 == s2: points to the same address as s1
String s3 = "AA"
String s4 = s1+s2; // s3 != s4: the literal "AA" is a different object
String.equals()比较字符串值,而不是地址。
答案 5 :(得分:-1)
你不能在字符串上使用==
,你需要使用String.equals
函数。
你可以这样使用它:
String s1 = "H";
String s2 = "e";
String s3 = s1+s2;
String s4 = "He";
System.out.println(s3.equals(s4));//false
String s5="h";
String s6="h";
System.out.println(s5.equals(s6));//true