public static void main(String[] args) {
String a = new String("abc");
String b = "abc";
String c = "abc" + "KDF" + "gh" +"rt" +"jk";
}
请在下面找到代码的字节代码。
Compiled from "NumOfStringObject.java"
public class com.practise.general.NumOfStringObject extends java.lang.Object{
public com.practise.general.NumOfStringObject();
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/Strin
g;)V
9: astore_1
10: ldc #3; //String abc
12: astore_2
13: ldc #5; //String abcKDFghrtjk
15: astore_3
16: return
}
我没有阅读/理解字节代码的经验,我想总共创建了3个String对象。
让我知道你的想法。
答案 0 :(得分:4)
是的,三个。乍一看,你想的更多,但编译器将结合字符串常量; details in JLS§15.28 - Constant Expressions。因此,编译器有效地将main
的正文视为:
String a = new String("abc");
String b = "abc";
String c = "abcKDFghrtjk";
它还为类中的等效常量重用了相同的字符串(interned,因此同一个字符串也可用于各个类),这意味着只有一个{{1}由该代码中"abc"
字面值的两次出现创建。
所以:
"abc"
"abc"
(组合多个文字的结果)"abcKDFghrtjk"
"abc"
作为单独的对象
答案 1 :(得分:2)
"abc"
已创建。"abc"
具有相同字符的字符串。"abcKDFghrtjk"
已创建。 "This is a string" // a string containing 16 characters
"This is a " + // actually a string-valued constant expression,
"two-line string" // formed from two string literals
在运行时通过串联计算的字符串是新创建的,因此是不同的 由常量表达式(§15.28)计算的字符串在编译时计算,然后被视为文字。
答案 2 :(得分:-4)
字符串不可变
阅读此处的讨论。应该帮助你。 String is immutable. What exactly is the meaning?
简而言之。 如果您见过String变量在代码中更改其值,则可以安全地假设已创建新对象。
String s = new String("some value");
和
String s = "some value";
非常相同。当您使用=
时,未设置该值,但实际上在同一参考s
下创建了一个新对象
编辑: 对于“Downvoters”,答案是 YES 。 创建了三个对象