【发布时间】:2013-07-29 09:29:10
【问题描述】:
有个面试题:
此语句将创建多少个实例:
String str1 = new String ("abc")
答案是 2:str1 和 "abc"。
对吗?
【问题讨论】:
-
我觉得答案是 1,因为“abc”被实习,而唯一被创建的“实例”是堆中的
str1
标签: java
有个面试题:
此语句将创建多少个实例:
String str1 = new String ("abc")
答案是 2:str1 和 "abc"。
对吗?
【问题讨论】:
str1
标签: java
在运行时只会创建一个实例。当类被加载时,文字 "abc" 将被保存在字符串池中,虽然从技术上讲,JVM 创建了一个 "abc" 的实例并将其保存在字符串池中。表达式 new String("abc") 创建了一个 String 的实例。
字符串字面量是对 String 类实例的引用(第 4.3.1 节、第 4.3.3 节)。
此外,字符串字面量总是引用 String 类的同一个实例。这是因为字符串文字 - 或者更一般地说,作为常量表达式值的字符串(第 15.28 节) - 是“内部的”,以便使用 String.intern 方法共享唯一实例。
另外,请阅读JLS 15.28
使用 String.intern 方法,String 类型的编译时常量表达式始终是“内部”的,以便共享唯一的实例。
推荐阅读:
【讨论】:
否 - 在堆中只创建了一个实例。文字“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
}
【讨论】:
str1 是变量引用,不是对象,“abc”是字符串字面量,不是对象
我认为,Heap 上只创建了一个实例
【讨论】:
new 关键字只创建一个实例,在您的示例中,您将对象的引用放入 str1(注意:否则它将被垃圾收集器删除)。
【讨论】:
将只创建一个字符串实例,因为 java 编译器具有避免不必要地创建 String 对象的智能。它将文件编译为类文件,在该文件中尝试尽可能优化代码。
在此处阅读有关字符串实习的信息http://en.wikipedia.org/wiki/String_interning
【讨论】:
2是正确的,当使用“abc”Java const pool创建一个“abc”实例,使用new(“abc”),它在堆中创建另一个String实例。
【讨论】:
您将创建两个 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));
【讨论】: