有一个面试问题:
将在此声明中创建多少个实例:
String str1 = new String ("abc")
答案是2:str1
和"abc"
。
这是对的吗?
答案 0 :(得分:7)
在运行时只会创建一个实例。加载类时,文字"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方法共享唯一实例。
建议阅读:
答案 1 :(得分:0)
否 - 在堆中只创建了一个实例。文字“abc”进入游泳池。编译并执行javap,您将在字节码中只看到一个 new 。
考虑这个类 -
public class InstanceTest {
public static void main(String... args){
String str1 =new String ("abc");
}
}
如果我们编译并做 -
javap -c InstanceTest
我们得到 -
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
}
答案 2 :(得分:0)
str1是变量引用,而不是Object,“abc”是String literal,而不是Object
我认为,在Heap上只创建了一个实例
答案 3 :(得分:0)
new 关键字只创建一个实例,在您的示例中,您将对象的引用放入str1(注意:否则它将被垃圾回收器删除)。
答案 4 :(得分:0)
您将创建两个String实例。 使用字符串构造函数而不是将它们声明为文字将始终创建不同的实例。
只需尝试以下代码:
String str = "abc";
String str2 = "abc";
String newString = new String(str);
System.out.println("Are " + str + " and " + newString + " the same instance? " + (str == newString));
System.out.println("Are " + str + " and " + str2 + " the same instance? " + (str == str2));
答案 5 :(得分:0)
只会创建一个字符串实例,因为java编译器具有避免不必要的String对象创建的智能。它会将文件编译为一个类文件,在该文件中它尽可能地优化代码。
答案 6 :(得分:0)
2是正确的,当使用“abc”Java const pool创建一个“abc”实例时,使用new(“abc”),它会在堆中创建另一个String实例。