インタビューの質問があります:
このステートメントで作成されるインスタンスの数:
String str1 = new String ("abc")
答えは 2:str1
と"abc"
です。
あれは正しいですか?
インタビューの質問があります:
このステートメントで作成されるインスタンスの数:
String str1 = new String ("abc")
答えは 2:str1
と"abc"
です。
あれは正しいですか?
2 つの 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 コンパイラには String オブジェクトの不要な作成を回避するインテリジェンスがあるため、作成される文字列のインスタンスは 1 つだけです。ファイルをクラス ファイルにコンパイルし、コードを可能な限り最適化しようとします。
ここで文字列インターニングについて読んでください http://en.wikipedia.org/wiki/String_interning
2 は正解です。"abc" Java const プールを使用して "abc" インスタンスを作成すると、new("abc") を使用すると、ヒープに別の String インスタンスが作成されます。
いいえ - ヒープ内に作成されたインスタンスは 1 つだけです。リテラルの「abc」はプールに入ります。コンパイルして javap を実行すると、バイトコードにnewが 1 つだけ表示されます。
このクラスを検討してください-
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
}