我有这个我无法理解的代码。在开始时,您可以看到两个相同的字符串,当我使用运算符==
进行比较时,它表示它是真的,与equals()
方法相同,但是当我在运行时运算符期间创建两个相同的字符串= =说错。为什么会这样?
这是否意味着当我对相同的字符串进行硬编码时,它们会被放置在内存中的相同位置并且两个引用都指向它?我发现了类似的question,但没有明确的答案。
public class StringTesting {
public static void main(String[] args){
String string1 = "hello"; //\
// } same place in the memory ?
String string2 = "hello"; ///
System.out.println(string1 == string2); //true
System.out.println(string1.equals(string2)); //true
String string3 = "hey";
String string4 = "he";
System.out.println(string3 == string4); //false
System.out.println(string3.equals(string4)); //false
string4 += "y";
System.out.println(string3 == string4); //false ????
System.out.println(string3.equals(string4)); //true
System.out.println(string3 + " " + string4); //hey hey
}
}
答案 0 :(得分:4)
以下复合赋值运算符:
string4 += "y";
在运行时执行字符串连接。由于string4
的值仅在运行时计算。并且在运行时完成的字符串连接会创建一个新对象。
来自JLS Section 3.10.5(参见本节末尾):
在运行时通过串联计算的字符串是新创建的,因此是不同的。
但是,如果执行两个字符串文字的连接,则不会创建不同的对象。因此,以下代码将返回true
:
"he" + "y" == "hey";
该JLS部分包含各种字符串连接示例的代码段:
String hello = "Hello",
String lo = "lo";
System.out.print((hello == "Hello") + " "); // true
System.out.print((Other.hello == hello) + " "); // true
System.out.print((other.Other.hello == hello) + " ");// true
System.out.print((hello == ("Hel" + "lo")) + " "); // true
System.out.print((hello == ("Hel" + lo)) + " "); // false
System.out.println(hello == ("Hel" + lo).intern()); // true
答案 1 :(得分:0)
string4 += "y";
创建一个新对象。
然而,字符串文字与优化放在内存中的相同位置(这称为string interning)。
答案 2 :(得分:0)
string1
,string2
和string3
都是字符串常量。即,它们在.class
文件中显示为常量池条目。在Java中,字符串常量被实现。
string4
是一个新字符串,通过将字符串常量"he"
然后附加"y"
来创建。因此,它不是字符串常量,也不是实习。
这就是string3 != string4
。