在String str1 = new String("abc")中创建了多少个实例?

Xia*_*Yao 6 java

有一个面试问题:

将在此声明中创建多少个实例:

String str1 = new String ("abc")
Run Code Online (Sandbox Code Playgroud)

答案是2:str1"abc".

那是对的吗?

NIN*_*OOP 7

在运行时只会创建一个实例.加载类时,文字"abc"将在字符串池中实现,但从技术上讲,JVM会创建一个实例"abc"并将其保留在字符串池中.表达式new String("abc")创建了一个实例String.

JLS 3.10.5:

字符串文字是对String类实例的引用(§4.3.1,§4.3.3).

此外,字符串文字始终引用类String的相同实例.这是因为字符串文字 - 或者更常见的是作为常量表达式(第15.28节)的值的字符串 - 被"实例化"以便使用String.intern方法共享唯一实例.

另外,阅读JLS 15.28

String类型的编译时常量表达式总是"实例化",以便使用String.intern方法共享唯一实例.

推荐阅读:

  1. Java String很特别
  2. 什么是java中的字符串池?
  3. 字符串,字面意思.


Dra*_*orn 0

否 - 堆中仅创建了一个实例。文字“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)