3

可能重复:
为什么当我们有 == 运算符时使用 equals() 方法?

当我尝试在 Java 中执行代码时,它给了我 2 个不同的输出

String txt1="Hello";
String txt2="Hello";
System.out.println((boolean)txt1==txt2);

String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println((boolean)txt1==txt2);
4

5 回答 5

8

字符串是对象。==比较对象引用,而不是字符串的内容。为此,请使用该String#equals方法。

在您的第一个示例中,txt1andtxt2是指向同一个 String对象的两个变量。所以他们是==彼此的。

在您的第二个示例中,txt1并且txt2指向两个不同 String的对象(它们具有相同的字符序列),因此它们彼此不==相关。


另外:写作几乎没有任何意义new String("string literal")。如果你不知道一个非常非常好的理由去做这件事,不要这样做。只有几个非常、非常、非常不寻常的情况下你可能会这样做,这与与低级别的东西交互有关。不是在正常的、可移植的 Java 代码中。

有时有使用的理由new String(String)(不是字符串文字,而是您从其他地方获得的实例,例如substring)。有关更多信息,请参阅本文(感谢Rp-)。

于 2012-11-05T13:03:13.207 回答
3

运算符将==检查引用是否相等,也就是说,true如果两个参数Strings 是同一个实例,则返回。

每当一个String字面量(例如"Hello")出现在一个类中时,一个String实例就会被实习(一种存储在内部缓存中以便可以重用)。

做完之后String txt1="Hello"txt1会是实习生的参考String。所以,

String txt1="Hello";
String txt2="Hello";

结果是相同的实例txt1txt2即被拘留的实例。

当您执行此操作String txt1=new String("Hello")时,它会String以实习实例作为参数调用构造函数(一种复制构造函数)。因此,txt1将是一个与实习实例具有相同值的 String实例,并且==操作符将返回false

有关该主题的更多信息,请参见 3.10.5。JLS 的字符串文字部分。

字符串文字是对 String 类实例的引用(第 4.3.1 节、第 4.3.3 节)。

此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串字面量 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。

以下问题的答案解释了Java 字符串何时被实习?. 以下链接详细说明了该主题:字符串平等和实习

作为旁注,请记住使用equals()以便根据其内容执行字符串比较。

于 2012-11-05T13:06:17.693 回答
2

在可能的情况下,Java 会尝试将字符串“共享”到安全空间。

String txt1="Hello";
String txt2="Hello";

是对同一个对象的两个引用(“Hello”)

String txt1=new String("Hello");
String txt2=new String("Hello");

是对两个不同实例的两个引用,每个实例都由副本初始化。

如果比较字符串,请始终使用“equals()”,否则结果难以预测。

于 2012-11-05T13:05:52.280 回答
0

如果要比较引用,请使用==运算符。

如果要比较两个字符串的内容,请使用equals方法。

于 2012-11-05T13:05:50.453 回答
0

做这个

String txt1="Hello";
String txt2="Hello";
System.out.println(txt1.hashCode());
System.out.println(txt2.hashCode());
System.out.println((boolean)txt1==txt2);


String txt1=new String("Hello");
String txt2=new String("Hello");
System.out.println(txt1.hashCode());
System.out.println(txt2.hashCode());
System.out.println((boolean)txt1==txt2);

您可以了解 java 在内部的处理方式。

于 2012-11-05T13:07:44.267 回答