Java 赋值运算符字符串对象

Java 赋值运算符字符串对象,java,object,assignment-operator,comparison-operators,Java,Object,Assignment Operator,Comparison Operators,我是JAVA编程新手。 我在书中读过 String a="Hello"; String b="Hello"; System.out.println(a==b); 当a&b引用字符串对象的不同实例时,这应该返回false Bcoz assignments操作符比较对象的实例,但仍然得到true 我正在使用EclipseIDE 书中的例子如下: String s = "s"; String sToo = "s"; System.out.println(a == b); System.out.pri

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

String a="Hello";
String b="Hello";
System.out.println(a==b);
当a&b引用字符串对象的不同实例时,这应该返回false

Bcoz assignments操作符比较对象的实例,但仍然得到true
我正在使用EclipseIDE

书中的例子如下:

String s = "s";
String sToo = "s";
System.out.println(a == b);
System.out.println(s == sToo);
这段代码为s==sToo打印“false”。那是因为s和sToo是 对字符串对象的不同实例的引用。因此,即使它们具有相同的值,它们也是 在相等运算符眼中不相等。此外,s==“s”打印为false,因为字符串文本 生成String类的另一个实例


书名:JAVA 7 for Absolute初学者

这是一个称为编译时常量字符串(也称为编译时相同的)的优化,可以将它们设置为内存中的同一对象(为最常用的对象类型之一节省空间)。或者说,用一个人的话来说

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

请注意,这只适用于在编译时定义的字符串,因此下面的语句将打印为false

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


注意:通过使b1和b2为最终值,允许在编译时知道b1+b2,可以使第二个代码段打印为真。总而言之,您需要非常小心,非常尊重string==string,在绝大多数情况下,您希望string.equals(string)不存在这种行为。

否,
a
b
的值是指同一个对象,这是由于字符串插入。你确定这本书给出了确切的例子吗?还要注意,赋值运算符根本不执行比较。赋值运算符为
=
;可能您正在考虑相等运算符,
==
?要查看它如何返回false,请尝试
String a=new String(“Hello”);字符串b=“你好”抱歉,确实输入了类型。正在考虑赋值运算符。真的很抱歉如果这本书真的是这么说的话,那就再读一本书。@JonSkeet ya我在想abt比较运算符这本书(a)不知道它在说什么,或者(b)是在java中包含此优化之前编写的,你只能希望它(b)@chetanmehta不,两者都是对象,但是编译器试图“聪明”并将它们组合成多个引用,所有引用都指向同一个对象,当它们在编译时已知是相同的时,这不仅仅是字符串文本,而是任何编译时常量
string
表达式。例如,在上一个示例中,将
b1
b2
声明为
final
变量将使
b1+b2
成为编译时常量表达式。对于a+1来说几乎足够了,但N.B.应为“使第二个代码段打印为true…”。另外,我更愿意看到引用:“所有的文字字符串和字符串值常量表达式都是实习的。”@TedHopp谢谢你的帮助,我必须承认,在回答这个问题的过程中,我学到了很多东西,而不仅仅是我最初的简单理解(这不是真正的想法,而是嘿嘿)
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