【发布时间】:2018-02-04 20:39:31
【问题描述】:
字符串是不可变的(事实)
假设我有下面给出的两个字符串对象:
String str1 = new String("dave");
String str2 = new String("dave");
在编译时,会发生字符串对象的实习。根据维基百科,它说“字符串实习是一种仅存储每个不同字符串值的副本的方法,该副本必须是不可变的。Java 中的所有编译时常量字符串都使用此方法自动实习。”
如果是这样,那么我的两个引用 str1 和 str2 会发生什么?编译后它们会指向哪个对象?
我希望它是有效的问题,否则请纠正我,我有点困惑。
【问题讨论】:
-
str1和str2是不是编译时间常数,因为它们都是用new实例化的 -
@khelwood,所以你的意思是这两个引用都会在编译时跳过实习。这两个相似的物体不会发生任何事情。它们将与各自的引用单独存在。是这样吗?
-
两个字符串字面量
"dave"可以被interned,但是str1和str2持有的对象是new在运行时创建的不同对象。它们确实单独存在。 -
换句话说
str1 != str2 && str2 != "dave", && str2 != "dave" -
System.out.println(str1 == str2);没有回答您的问题吗?new String("dave")不与"dave"相同。
标签: java string object reference immutability