有一个面试问题:在字符串中创建多少个实例str1 = new String(“abc”)?
多少实例将在此语句创建:
String str1 = new String ("abc")
答案是2:str1
和。
这是正确的吗?
有一个面试问题:在字符串中创建多少个实例str1 = new String(“abc”)?
多少实例将在此语句创建:
String str1 = new String ("abc")
答案是2:str1
和。
这是正确的吗?
否 - 在堆中只创建了一个实例。字面上的“abc”进入游泳池。编译并执行javap,你将在字节码中看到只有一个新的。
考虑这个讲座
public class InstanceTest {
public static void main(String... args){
String str1 =new String ("abc");
}
}
如果我们编译并做 -
的javap -c InstanceTest
我们GET-
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
}
“abc”将会转到字符串池,不是吗? –
@ d'alar'cop是的。 –
str1和一个瓦里可以参考,而不是Object和“ABC”是字符串文字,而不是Object
我认为,对堆
只有一个实例在运行时创建只创建一个实例。加载类时,文字将在字符串池中执行,但从技术上讲,JVM创建的实例并将其保留在字符串池中。表达式new String("abc")
创建String
的实例。
字符串文字是类字符串(第4.3.1节,§4.3.3)的实例的引用。
此外,字符串常量指的是类String的同一个实例。这是因为字符串文字 - 或者更一般地说是常量表达式(§15.28)值的字符串 - 被“实施”,以便使用方法String.intern共享唯一实例。
此外,阅读JLS 15.28
编译时String类型的常量表达式总是“实习”,以便共享独特实例,使用该方法的String.intern。
推荐阅读:
+1。我认为“实习生”这个词让人感到困惑。如果已经创建了“abc”并放置在sting pool中,那么jvm不必创建一个。它可以指的是现有的。如果不存在,则必须创建一个并将其放置到池中。然后“新”关键字也增加了混淆,当语句是“当你用”新“关键字实例化,一个新的对象被创建”..这使得它听起来像“abc”将不会被创建,因为强大“新”没有使用。 “abc”只是在那里神奇地。 –
String s1 = new String(“hello”); ,在JVM级别创建多少个引用?我知道两个对象:1在类加载“hello”时,1在实际执行命令时。 1的引用是s1,我的疑问是还有第二个引用s2,它是在类加载时传递给“new String()”构造函数的“hello”字符串的结果。在java中,我们不可能在一个函数或构造函数中传递一个对象本身,我们只能传递一个引用。另外,应该有第三个引用s3,它应该是新String(“hello”)的结果,然后分配给s1? –
的新关键字只能创建一个实例,并在你的榜样,你把对象的引用到STR1(注:否则会被垃圾收集器被删除)。
您将创建两个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));
字符串只有一个实例将被创建,由于Java编译器具有智能以避免不必要的创建字符串objects.It将文件编译为一个类文件它试图尽可能优化代码。
2是正确的,当用“ABC”的Java常量池中创建一个“ABC”例如,使用新的(“ABC”),它建立在堆另一个字符串实例。
我觉得答案是1,因为“abc”被拦截,并且创建的唯一“实例”是堆中的“str1” – sanbhat