字符串处理:==的用法

时间:2014-05-15 08:31:19

标签: java string compare

请您解释下面的代码:

我知道==比较了引用而不是值。 但我不清楚以下代码究竟发生了什么?

    public class StringEquals {
    public static void main(String args[])
    {

        String s1="AB";
        String s2="AB"+"C";
        String s3="A"+"BC";
        if(s1==s2)
        {
            System.out.println("s1 and s2 are equal");
        }
        else
        {
            System.out.println("s1 and s2 are notequal");
        }
        if(s2==s3)
        {
            System.out.println("s2 and s3 are equal");
        }
        else
        {
            System.out.println("s2 and s3 are notequal");
        }
        if(s1==s3)
        {
            System.out.println("s1 and s3 are equal");
        }
        else
        {
            System.out.println("s1 and s3 are notequal");
        }   
    }
    }

3 个答案:

答案 0 :(得分:0)

在我的系统上,代码打印

s1 and s2 are notequal
s2 and s3 are equal
s1 and s3 are notequal

如果您的问题是原因,那么它与Java编译器如何处理字符串文字有关。

通常,为了提高效率,Java会将对同一个字符串文字的所有引用指向同一个对象。在s2s3的情况下,编译器似乎已经意识到串联的结果是相同的字符串文字,因此它分配了引用s2s3指向内存中的同一个对象。这就是为什么这两者比较等于==

由于s1与[{1}}和s2的值不同,因此会为其分配不同的内存位置,因此引用不会与s3进行比较

答案 1 :(得分:0)

在您的代码中,您可能会输出System.out.println("s2 and s3 are equal");

这是由于string interning。当字符串是编译时常量时,JVM将对相同字符串的所有引用设置为同一对象。这是一种节省效率的方法,java标准并没有强制JVM这样做,它只允许它。你永远不应该依赖这种行为。

因为在编译时我们知道"AB"+"C""A"+"BC"都会评估为" ABC"可以将s2s3都设置为引用字符串池中的单个字符串。

毋庸置疑,即使这种情况在某些情况下起作用,也是一条危险的道路,应该始终使用string.equals(otherString)来比较字符串

答案 2 :(得分:0)

在Java中,==检查两个对象是否完全相同,有时候它不是你想的那样。

String s1 = new String("AB")
String s2 = new String("AB")

虽然s1s2具有相同的内容,但s1 == s2会返回false。由于它们具有不同的引用,但s1 s2具有相同的值,因此s1.equals(s2)返回true