我想知道为什么第二个System.out.println
语句打印为false而不是true。我相信字符串会被缓存,s1和s3都指向同一个字符串对象,那么当两个字符串具有相同的值时,为什么会打印false。
String s="hello";
String s1="hello5";
String s2="hello"+5;
String s3="hello"+s.length();
System.out.println(s1==s2);//prints true
System.out.println(s1==s3); //I know equals method would print true
答案 0 :(得分:4)
String s2="hello"+5;
String s3="hello"+s.length();
System.out.println(s1==s2);//prints true
System.out.println(s1==s3); //I know equals method would print true
第二个SOP在运行时检查而不是在编译时检查。
答案 1 :(得分:3)
编译器在编译期间将"hello" + 5
替换为“hello5”(这是有效的,因为它们都是常量),因为在运行时调用String#length()
(因此编译器不能使用“hello5”) “直接)。
字节代码:
0: ldc #19 // String hello ==> s
2: astore_1
3: ldc #21 // String hello5 ==> s1
5: astore_2
6: ldc #21 // String hello5 ===> s2 <==
8: astore_3
9: new #23 // class java/lang/StringBuilder
12: dup
13: ldc #19 // String hello
15: invokespecial #25 // Method java/lang/StringBuilder."<init>":(Ljava/lang/String;)V
18: aload_1
19: invokevirtual #28 // Method java/lang/String.length:()I
22: invokevirtual #34 // Method java/lang/StringBuilder.append:(I)Ljava/lang/StringBuilder;
25: invokevirtual #38 // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
答案 2 :(得分:1)
第二个print语句为false,因为在运行时,两个字符串s1和s3指向不同的内存位置。
E.g。如果我们有两个字符串:
String s1 = "Hi";
String s2 = "Hi".trim();
System.out.println(s1==s2); //Yields false
答案 3 :(得分:1)
String s3="hello"+s.length();
在运行时计算,因为除非length()
函数未被评估,否则它的值将保持未知。
String Literal Pool在这方面发挥着重要作用 s1和s2将引用字符串文字池中的相同字符串。
这将返回false:
String s1 = "hello";
String s2 = new String("hello");// creates new string in pool
检查字符串和对象中的相等性时,使用equals()
会更好。对于对象,您必须覆盖equals()
方法,因为默认情况下equals()
和==
具有相同的性质。