有一个面试问题:
将在此声明中创建多少个实例:
String str1 = new String ("abc")
Run Code Online (Sandbox Code Playgroud)
答案是2:str1
和"abc"
.
那是对的吗?
在运行时只会创建一个实例.加载类时,文字"abc"
将在字符串池中实现,但从技术上讲,JVM会创建一个实例"abc"
并将其保留在字符串池中.表达式new String("abc")
创建了一个实例String
.
字符串文字是对String类实例的引用(§4.3.1,§4.3.3).
此外,字符串文字始终引用类String的相同实例.这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被"实例化"以便使用String.intern方法共享唯一实例.
另外,阅读JLS 15.28
String类型的编译时常量表达式总是"实例化",以便使用String.intern方法共享唯一实例.
推荐阅读:
否 - 堆中仅创建了一个实例。文字“abc”进入池。编译并执行 javap,您将在字节码中仅看到一个新的内容。
考虑这个类——
public class InstanceTest {
public static void main(String... args){
String str1 =new String ("abc");
}
}
Run Code Online (Sandbox Code Playgroud)
如果我们编译并执行-
javap -c 实例测试
我们得到——
public class InstanceTest {
public InstanceTest();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String...);
Code:
0: new #2 // class java/lang/String
3: dup
4: ldc #3 // String abc
6: invokespecial #4 // Method java/lang/String."<init>":(Ljava/lang/String;)V
9: astore_1
10: return
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4269 次 |
最近记录: |