Unterschied int[] x = new int[]{...}, int[] x = {...}



  • Ja, also im Titel steht eigentlich schon alles. Ich frage mich was der technische Unterschied zwischen folgenden Deklarationen ist:

    int[] array = new int[]{1, 2, 3};
    

    und

    int[] array = {1, 2, 3};
    

    Mit der ersten Variante kann ich auch einer Methode ein initialisiertes Array übergeben:

    methode(new int[]{1, 2, 3});
    

    Ohne new geht das nicht.

    Wird bei der Variante ohne new das Array auf dem Stack angelegt?

    Edit: OK, das Array wird nicht auf dem Stack angelegt. Ich konnte auf ein von einer Methode zurückgeliefertes Array zugreifen.

    Danke für die Antworten 🙂



  • http://www.tutorialspoint.com/java/java_arrays.htm

    Unter "Create Arrays" sollte das stehen, was du wissen willst.



  • In dem Tutorial werden zwar beide Varianten verwendet, allerdings wird nicht darauf hingewiesen oder der Unterschied genannt.

    Vielleicht gibt es auch keinen Unterschied und bei der Initialisierung wird einfach eine weitere syntaktische Variante zugelassen um z.B. C++-Programmierern entgegenzukommen.



  • Alternatively you can create arrays as follows

    Sollte also das gleiche machen / aequivalent sein.



  • Die Varianten sind in der Tat identisch.

    public void method1() {
    	int[] array = new int[] {1, 2, 3};
    }
    
    public void method2() {
    	int[] array = {1, 2, 3};
    }
    

    Bytecode:

    public void method1();
        Code:
           0: iconst_3
           1: newarray       int
           3: dup
           4: iconst_0
           5: iconst_1
           6: iastore
           7: dup
           8: iconst_1
           9: iconst_2
          10: iastore
          11: dup
          12: iconst_2
          13: iconst_3
          14: iastore
          15: astore_1
          16: return
        LineNumberTable:
          line 3: 0
          line 4: 16
    
      public void method2();
        Code:
           0: iconst_3
           1: newarray       int
           3: dup
           4: iconst_0
           5: iconst_1
           6: iastore
           7: dup
           8: iconst_1
           9: iconst_2
          10: iastore
          11: dup
          12: iconst_2
          13: iconst_3
          14: iastore
          15: astore_1
          16: return
        LineNumberTable:
          line 7: 0
          line 8: 16
    

  • Mod

    Es gibt etwas aehnliches mit Strings:

    String a = "Hallo!";
    String b = "Hallo!";
    

    vs.

    String a = new String("Hallo!");
    String b = new String("Hallo!");
    

    Im Gegensatz zu dem Array Beispiel weiter oben kann es bei den Strings einen erheblichen unterschied machen. Strings sind "immutable", koennen also nach der Erzeugung nicht mehr veraendert werden. Das heisst, dass man schon vorhandene Strings unter umstaenden wiederverwenden kann. Hier ist es so, dass im ersten Fall der String wiederverwendet werden koennte. Im zweiten Fall wird explizit gesagt, dass immer ein neuer String angelegt werden soll. Deswegen koennte die zweite Variante mehr Speicherplatz benoetigen.

    Allerdings ist das Verhalten des Compilers hier sicherlich nicht garantiert. Man koennte sicherlich also auch einen Compiler finden, der in beiden Faellen den gleichen Bytecode erzeugt.

    Aehnlich zu den Strings verhaelt es sich z. B. auch mit Integer-Objekten oder anderen Objekten, die immutable sind. Aber wie schon gesagt: Arrays gehoeren nicht dazu.



  • Dieser Beitrag wurde gelöscht!

Anmelden zum Antworten