我有附加String的情况。我很困惑..
public static void foo() {
String s = "str4";
String s1 = "str" + s.length();
System.out.println("(s==s1) = " + (s1 == s));
}
和
public static void bar() {
String s = "str4";
String s1 = "str" + "4";
System.out.println("(s==s1) = " + (s1 == s));
}
在第一种情况下,它返回'false'但在第二种情况下'true' 据我所知,在两种情况下都会在堆上创建'str4'对象。所以它在两种情况下都应该返回true。但事实并非如此。 请有人帮助我,为什么会这样。 ?谢谢!
答案 0 :(得分:3)
使用
s1.equals(s)
比较字符串,否则你比较引用。
在第二种情况下,它返回true
,因为String s1 = "str" + "4";
将优化为String s1 = "str4";
而s
和s1
将引用相同的字符串。
答案 1 :(得分:0)
你需要使用.equals()来实现这个
.equals() // if you dont want to ignore case
.equalsIgnoreCase() // if you want to ignore case
==比较参考文献。
在第二种情况下,两个字符串都相等。所以引用也相等。
String s = "str4";
String s1 = "str" + "4"; .//finally str4
这里s1和s2的内容相等。所以他们有相同的参考。
答案 2 :(得分:0)
如果两个引用都引用同一个对象,则Java中的==运算符仅返回true。如果您尝试比较两个字符串的等效内容,则必须使用equals()方法。
答案 3 :(得分:0)
根据我自己的理解:
“str”=>字符串
“4”=>串
然而,
s.length()=> INT
使用==,比较内存位置。
使用第一个示例,Java创建另一个字符串,该字符串位于“s”位置以外的另一个内存位置,因为您尝试执行String + int = String。
第二个示例返回true,因为它只是与您的's'相同的内存位置,只是值被更改。 String + String =连接字符串
由于您要比较两个字符串内部是否具有相同的字符但不一定是相同的位置,因此 s.equals(s1) 是最佳解决方案
但是,如果您想测试两个变量是否指向同一个对象,则必须使用 == ,因为其浅层比较。