2

我有点告诉某人,我们必须使用 String.equals 方法来比较两个字符串值,我们不能简单地在 java 中使用 == 运算符来比较字符串,并告诉他 == 将返回 false,因为它不会比较字符串值但字符串对象引用值。

我写了这个例子来给他看,但令我惊讶的是它总是为 == 运算符打印 true .. 这是代码

public void exampleFunc1(){

    String string1 = "ABC";
    String string2 = "ABC";

    if(string1 == string2)
        System.out.println("true");
    else{
        System.out.println("false");

    }   
    System.out.println(" Are they equal "+(string1 == string2)); // this shouldn't print True but it does
    System.out.println(" Are they equal "+(string1.equals(string2)));

}

输出:-

它们是否相等真实

它们是否相等真实

所以这里的问题是在什么情况下 == 对象上的运算符可以打印 true,除了两个对象是同一个实例?

4

3 回答 3

2

String是少数特殊情况之一。

String保持一个特殊的“实习”池String。方法在这个池中myString.intern()查找。myString如果String池中已经存在具有相同内容的另一个,则返回指向它的指针。如果没有,myString则添加(并返回一个指针)。

当您说 时myString= myString.intern() ;,您实际上是在myString引用共享副本或其底层String可用于将来共享(并且没有重复)。大多数创建Strings 的库方法都受制于此,尤其是String文字。

“实习”的其他情况发生在包装类型Integer,Long等。它们没有构造函数,但是静态方法valueOf()可以返回预构建的共享对象(通常是最接近零的 256 个值),以及返回新对象的静态方法。不能。后者问题不大,因为这些类型比Strings 更轻量级。 Long,例如,只有 8 个字节的有效负载。 String包含一个char[]即使是空的也是 16 个字节左右。

要回答您的问题,您不能指望任何“实习”机制。它们在过去发生了变化,并且将来可能会发生变化(甚至从一个 JVM 到另一个),从而使您的代码无法使用。始终使用equals.

于 2013-09-01T04:59:09.673 回答
1

你应该使用

String string1 = new String("ABC");

String string2 = new String("ABC");

那么一切都会像你想的那样正确,

在这种情况下,“ABC”只是对 const 字符串的引用。

于 2013-09-01T04:59:52.270 回答
0

编译器可能正在优化分配并且只创建一个 String 对象。如果您使用显式 String 构造函数,则==操作应按预期运行。

于 2013-09-01T05:01:21.063 回答