6

インタビューの質問があります:

このステートメントで作成されるインスタンスの数:

String str1 = new String ("abc")

答えは 2:str1"abc"です。

あれは正しいですか?

4

7 に答える 7

0

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));
于 2013-07-29T09:37:10.710 に答える
0

Java コンパイラには String オブジェクトの不要な作成を回避するインテリジェンスがあるため、作成される文字列のインスタンスは 1 つだけです。ファイルをクラス ファイルにコンパイルし、コードを可能な限り最適化しようとします。

ここで文字列インターニングについて読んでください http://en.wikipedia.org/wiki/String_interning

于 2013-07-29T09:38:12.680 に答える
0

2 は正解です。"abc" Java const プールを使用して "abc" インスタンスを作成すると、new("abc") を使用すると、ヒープに別の String インスタンスが作成されます。

于 2013-07-29T09:38:57.920 に答える
0

いいえ - ヒープ内に作成されたインスタンスは 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        
}
于 2013-07-29T09:31:23.440 に答える