赋值运算符String对象

che*_*hta 0 java object assignment-operator comparison-operators

我是JAVA编程的新手.我在书中看过

String a="Hello";
String b="Hello";
System.out.println(a==b);
Run Code Online (Sandbox Code Playgroud)

这应该返回false,因为a&b引用String对象的不同实例.

Bcoz赋值运算符比较对象的实例,但我仍然得到一个真实的.
我正在使用Eclipse IDE.

书中的例子如下:

String s = "s";
String sToo = "s";
System.out.println(a == b);
System.out.println(s == sToo);
Run Code Online (Sandbox Code Playgroud)

对于s == sToo,该位代码打印"false".那是因为s和sToo是对String对象的不同实例的引用.因此,即使它们具有相同的值,它们在相等运算符的眼中也是不相等的.此外,s =="s"打印为false,因为字符串文字产生String类的另一个实例.

书名:JAVA 7 for Absolute Beginners

Ric*_*gle 7

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

"所有文字字符串和字符串值常量表达式都是实例化的."

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

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

要么

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
Run Code Online (Sandbox Code Playgroud)

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

  • 它不仅仅是被实习的字符串文字 - 它是任何编译时常量`String`表达式.例如,在你的上一个例子中,将`b1`和`b2`声明为`final`变量会使`b1 + b2`成为编译时常量表达式. (4认同)