在java中评估两个字符串

时间:2015-09-22 09:41:18

标签: java string

我想知道为什么第二个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

4 个答案:

答案 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()==具有相同的性质。