由于
String实例是不可变的
,因此Java语言能够进行一些优化,以使
String文字(或更一般而言,
String其值为编译时间常数)可以 被
插入并实际上引用同一(即
==)对象。
[JLS
3.10.5字符串文字](http://java.sun.com/docs/books/jls/third_edition/html/lexical.html#3.10.5)
每个字符串文字都是对实例的引用
classString。String对象具有恒定值。使用方法,可以对字符串文字(或更一般而言,是常量表达式的值的字符串)进行“
interned”,以便共享唯一的实例String.intern。
这就是为什么您得到以下信息的原因:
System.out.println("yes" == "yes"); // trueSystem.out.println(99 + "bottles" == "99bottles"); // trueSystem.out.println("7" + "11" == "" + '7' + '1' + (char) (50-1)); // trueSystem.out.println("trueLove" == (true + "Love")); // trueSystem.out.println("MGD64" == "MGD" + Long.SIZE);也就是说它需要说,你应该 不 依赖
==于
String一般的比较,而应该使用
equals针对非
null
instanceofString。特别是,请不要为自己
intern()所有的东西而着迷,
String以便在
==不知道字符串实习如何工作的情况下使用它。
上 new String(...)
如果出于某些特殊原因需要创建 两个
String对象
(因此不是
==定义的对象)并且仍然是
equals,则可以使用此构造函数,其中包括:
public String(Stringoriginal):初始化一个新创建的String对象,使其代表与参数相同的字符序列;换句话说,新创建的字符串是参数字符串的副本。
除非需要显式的原始副本,否则不需要使用此构造函数,因为Strings它们是不可变的。
因此,您可以拥有:
System.out.println("x" == new String("x")); // false的
new操作者总是创建一个新对象,因此上述被保证打印
false。也就是说,这实际上通常不是您真正需要做的事情。只要有可能,您应该只使用字符串文字,而不是
newString为其显式创建一个。



