87)以下代码中将创建多少个对象?
String s1 = "string1";
String s2 = "string1";
String s3 = "string1";
答案是:只有一个对象
89)以下代码中将创建多少个对象?
String s = new String("Welcome");
答案是:两个对象,一个在字符串常量池中,另一个在非池(堆)中.
解决方法:
尽管String是一个用Java编写的类,但它是一种特殊的类,它与JVM有一些特殊的关系.其中一个是字符串文字(用引号括起来的字符序列).当JVM看到“abc”时,它会执行以下操作:
String obj = stringLiteralsCache.get("abc");
if (obj == null) {
obj = new String("abc");
stringLiteralsCache.put("abc", obj);
}
因此,在第一个示例中,第一行导致创建新实例,但接下来的两行只是从缓存中获取已创建的实例.
但缓存仅适用于文字.当您显式调用构造函数时,它无法阻止创建新实例.因此,新的String(“Welcome”)创建了2个对象:一个来自literal Welcome,因为它还没有在缓存中,第二个来自String构造函数的显式调用.
标签:java
来源: https://codeday.me/bug/20190722/1505866.html