尽管
String是用Java编写的类,但它是一种与JVM有特殊关系的特殊类。其中之一是字符串文字(用引号引起来的字符序列)。当JVM看到
"abc"它时,它会执行以下 *** 作:
String obj = stringLiteralsCache.get("abc");if (obj == null) { obj = new String("abc"); stringLiteralsCache.put("abc", obj);}
因此,在您的第一个示例中,第一行导致创建新实例,但是接下来的两行仅从缓存中获取已创建的实例。
但是,缓存仅适用于文字。当您显式调用构造函数时,它不能阻止创建新实例。因此,
newString("Welcome")创建2个对象:一个来自文字,
Welcome因为它尚未在缓存中,第二个来自显式调用String构造函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)