0

我是 JAVA 编程的新手。我在我的书中读过

String a="Hello";
String b="Hello";
System.out.println(a==b);

这应该返回false,因为 a & b 指的是 String 对象的不同实例。

Bcoz 分配运算符比较对象的实例,但我仍然得到一个true
我正在使用 Eclipse IDE。

书中的例子是这样的:

String s = "s";
String sToo = "s";
System.out.println(a == b);
System.out.println(s == sToo);

那段代码为 s == sToo 打印“false”。这是因为 s 和 sToo 是对 String 对象不同实例的引用。因此,即使它们具有相同的值,但在相等运算符的眼中它们并不相等。此外, s == “s” 打印为 false,因为字符串文字产生了​​ String 类的另一个实例。

书名:JAVA 7 for Absolute Beginners

4

1 回答 1

8

这是一种称为字符串池的优化,其中可以设置编译时常量字符串(又名在编译时相同),以便它们实际上是内存中的同一个对象(为最常用的对象类型之一节省空间) . 或者用文档的话来说;

“所有文字字符串和字符串值的常量表达式都被实习了。”

请注意,这仅适用于在编译时定义的字符串,因此以下内容确实会打印错误。

String a="Hello";
String b=new String("Hello");
System.out.println(a==b); //prints false because a new string was forced

或者

String a="Hello";
String b1="He";
String b2="llo";
String b=b1+b2;

System.out.println(a==b); //prints false because b wasn't know to be "Hello" at compile time so could not use string pooling

NB 可以通过使 b1 和 b2 最终化来使第二个片段打印为 true,从而在编译时就可以知道 b1+b2。总而言之,您需要非常小心并以相当尊重的态度对待 string==string,在绝大多数情况下,您希望 string.equals(string) 不存在这种行为。

于 2013-10-06T16:13:51.807 回答