赋值运算符String对象

时间:2013-10-06 16:01:40

标签: java object assignment-operator comparison-operators

我是JAVA编程的新手。 我已经在我的书中读到了它

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

这应该返回 false 作为& 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

1 个答案:

答案 0 :(得分:7)

这是一个名为string pooling的优化,其中可以设置编译时常量字符串(也称为在编译时相同的 ),使得它们实际上是内存中的相同对象(为最常用的一种对象节省空间)。或者用docs;

的话来说
  

“所有文字字符串和字符串值常量表达式都是   实习“。

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

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

N.B。通过使b1和b2成为最终,可以使第二个片段打印为真,从而允许在编译时知道b1 + b2。总而言之,您需要非常小心并且以相当尊重的方式处理string == string ,在绝大多数情况下,您需要string.equals(string),其中不存在此行为。