字符串比较意外输出

时间:2012-02-01 19:51:43

标签: java string

在下面的程序中我得到输出 false 。但是根据我的理解,当我们添加两个临时引用变量时,结果进入常量池,不允许重复所以我们必须在这里获得输出为真,但我们得到 false作为输出。有人可以解释我背后的理由吗?

package com.lara;

public class Man9 
{
    public static void main(String[] args) 
    {
        String s1 = "ja";
        String s2 = "va";
        String s3 = "ja".concat("va");
        String s4 = "java";
        System.out.println(s3==s4);
    }
}

2 个答案:

答案 0 :(得分:3)

您对字符串连接的理解不正确。

默认情况下,只有字符串常量才会被中断。现在,字符串常量不是只是字符串文字 - 它可以包含使用+运算符的其他常量的串联,例如

String x = "hello";
String y = "hel" + "lo";
// x == y, as the concatenation has been performed at compile-time

但是在你的情况下,你正在进行一个方法调用 - 这不是Java语言规范在确定常量字符串表达式时所考虑的部分。

请参阅section 15.28 of the JLS了解被视为“常数”的内容。

答案 1 :(得分:1)

你需要使用s3.equals(s4),而不是s3 == s4。

然后你会得到真实的结果。

见下文的成绩单

C:\temp>java foo
false
true

C:\temp>type foo.java
public class foo
{
    public static void main(String[] args)
    {
        String s1 = "ja";
        String s2 = "va";
        String s3 = "ja".concat("va");
        String s4 = "java";
        System.out.println(s3==s4);
        System.out.println(s3.equals(s4));
    }
}