赋值运算符 String 对象
Posted
技术标签:
【中文标题】赋值运算符 String 对象【英文标题】:assignment operator String object 【发布时间】:2013-10-13 04:48:17 【问题描述】:我是 JAVA 编程新手。 我在我的书中读过它
String a="Hello";
String b="Hello";
System.out.println(a==b);
这应该返回 false,因为 a & b 指的是不同的 String 对象实例。
因为赋值运算符比较对象的实例,但我仍然得到 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” 打印错误,因为字符串文字 产生另一个 String 类的实例。
书名:JAVA 7 for Absolute Beginners
【问题讨论】:
不,a
和 b
的值指的是同一个对象,因为是字符串实习。你确定这本书给出了那个exact的例子吗?另请注意,assignment 运算符根本不执行比较。赋值运算符为=
;也许您在考虑相等运算符==
?
要查看它如何返回 false,请尝试 String a=new String("Hello"); String b = "Hello";
对不起真的做了类型。正在考虑赋值运算符。真的很抱歉
如果书上真的这么说,那就再读一本书。
@JonSkeet ya 我在想比较运算符
【参考方案1】:
这是一个名为string pooling 的优化,其中可以设置编译时常量字符串(又名在编译时是相同的),以便它们在内存中确实是同一个对象(节省最常用的对象类型之一的空间)。或者用docs的话来说;
"所有文字字符串和字符串值常量表达式都是 实习。”
请注意,这仅适用于在编译时定义的字符串,因此以下内容确实会打印错误。
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
注意可以通过使 b1 和 b2 为 final 来使第二个 sn-p 打印为 true,从而在编译时知道 b1+b2。总而言之,您需要非常小心并非常尊重地对待 string==string,在绝大多数情况下,您希望 string.equals(string) 不存在这种行为。 p>
【讨论】:
这本书(a)不知道它在说什么或者(b)是在这个优化被包含在java中之前写的,你只能希望它的(b) @chetanmehta 不,两者都是对象,但是编译器会尝试“聪明”并将它们组合成多个引用,这些引用都指向同一个 object 已知它们是编译时相同 被实习的不仅仅是字符串文字——它是任何编译时常量String
表达式。例如,在您的最后一个示例中,将 b1
和 b2
声明为 final
变量将使 b1+b2
成为编译时常量表达式。
对于 +1 来说几乎足够了,但 N.B.应该读为“导致第二个 sn-p 打印 true ......”。另外,我宁愿看到 the docs 引用:“所有文字字符串和字符串值的常量表达式都是实习的。”
@TedHopp 感谢您的帮助,我必须承认我在回答这个问题时学到了很多东西,超出了我最初的简单理解(这不是真正的想法,但是嘿嘿) 以上是关于赋值运算符 String 对象的主要内容,如果未能解决你的问题,请参考以下文章