ArrayList-Initialisierung entspricht der Array-Initialisierung [duplicate]

Lesezeit: 6 Minuten

Benutzer-Avatar
Jonathan

Mir ist bewusst, dass Sie ein Array während der Instanziierung wie folgt initialisieren können:

String[] names = new String[] {"Ryan", "Julie", "Bob"};

Gibt es eine Möglichkeit, dasselbe mit einer ArrayList zu tun? Oder muss ich den Inhalt einzeln mit hinzufügen array.add()?

Arrays.asList kann hier helfen:

new ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));

  • Es ist erwähnenswert, dass, es sei denn, Sie benötigen unbedingt eine ArrayList Es ist wahrscheinlich besser, nur die zu verwenden List das kommt zurück Arrays#asList.

    – Maerik

    3. Mai 2010 um 20:51 Uhr

  • @maerics, das ist auch erwähnenswert Arrays.asList() Rückkehr ein unveränderbar Sammlung. 🙂

    – Konstantin Jowkow

    9. Oktober 2013 um 9:46 Uhr

  • Die von zurückgegebene Liste Arrays.asList() ist NICHT unveränderbar, @kocko. Es hat eine feste Größe, aber Sie können die Referenzen so ändern, dass sie auf ganz andere Objekte zeigen Arrays.asList(...).set(0,new String("new string")) Dieser Code funktioniert und setzt das erste Element der Liste auf das String-Objekt mit dem Wert “new string”. Und tatsächlich schreibt es in das native Array! Definitiv nicht unveränderbar.

    – Jason

    19. April 2014 um 15:22 Uhr

  • Warum erwähnen die Leute in ihren Beiträgen nie die korrekte Import-/Include-/Require-Anweisung?

    – Tomáš Zato – Wiedereinsetzung von Monica

    9. Februar 2016 um 20:58 Uhr

  • Weil eine gut konfigurierte IDE die Importe für Sie schreibt, solange es eine einzige passende Klasse gibt, wie es hier der Fall ist.

    – Verdienst

    9. Februar 2016 um 22:25 Uhr

Benutzer-Avatar
Brian Agnew

Ja.

new ArrayList<String>(){{
   add("A");
   add("B");
}}

Was dies tatsächlich tut, ist das Erstellen einer Klasse, die von abgeleitet ist ArrayList<String> (die äußeren geschweiften Klammern tun dies) und deklarieren dann einen statischen Initialisierer (die inneren geschweiften Klammern). Das ist eigentlich ein innere Klasse der enthaltenden Klasse, also hat sie eine implizite this Zeiger. Kein Problem, es sei denn, Sie möchten es serialisieren oder erwarten, dass die äußere Klasse von der Garbage Collection erfasst wird.

Ich verstehe, dass Java 7 bereitstellen wird zusätzliche Sprachkonstrukte um genau das zu tun, was Sie wollen.

BEARBEITEN: Neuere Java-Versionen bieten brauchbarere Funktionen zum Erstellen solcher Sammlungen und sind eine Untersuchung über die oben genannten Punkte wert (bereitgestellt zu einem Zeitpunkt vor diesen Versionen).

  • Nicht meine Ablehnung, aber ich halte das für einen ziemlich bösen Missbrauch anonymer Klassen. Zumindest versuchst du nicht, es als besonderes Feature auszugeben …

    – Michael Borgwardt

    3. Mai 2010 um 21:34 Uhr

  • Ich glaube nicht, dass das Erstellen einer anonymen Klasse schlecht ist an sich. Dessen sollte man sich aber bewusst sein.

    – Brian Agnew

    8. Mai 2010 um 8:39 Uhr

  • Ich vermute, dass es immer wieder herabgestuft wird, weil es genau das tut, was das OP vermeiden wollte: die Verwendung von add () für jedes Element.

    – WXB13

    14. Januar 2014 um 9:04 Uhr

  • Ich würde über ein Downvoting nachdenken, weil Eine Klasse erstellen, nur um ein einzelnes Objekt zu initialisieren, erscheint mir übertrieben. Aber ich bin kein Java-Experte genug, um zu wissen, ob dies eine schlechte Sache ist. Vielleicht wird das Erstellen Tausender unnötiger Klassen in einem großen Programm als gute Java-Codierung angesehen? Es ist auch schrecklich ausführlich, wenn es viele Elemente gibt. Gibt es irgendein Vorteil zu diesem Ansatz im Vergleich zu anderen vorgeschlagenen Antworten?

    – WerkzeugmacherSteve

    13. September 2015 um 16:40 Uhr


  • Es wurde möglicherweise abgelehnt, da es nur für endgültige Werte funktioniert. Ich stimme zu, dass Ihre Lösung für die gestellte Frage funktioniert, aber Sie wissen, dass einige Leute auf StackOverflow sind.

    – Josch

    15. Dezember 2015 um 16:50 Uhr


Hier ist der nächste, den Sie bekommen können:

ArrayList<String> list = new ArrayList(Arrays.asList("Ryan", "Julie", "Bob"));

Noch einfacher geht es mit:

List<String> list = Arrays.asList("Ryan", "Julie", "Bob")

Wenn Sie sich die Quelle für Arrays.asList ansehen, wird eine ArrayList erstellt, die jedoch standardmäßig in eine Liste umgewandelt wird. Sie könnten dies also tun (aber nicht zuverlässig für neue JDKs):

ArrayList<String> list = (ArrayList<String>)Arrays.asList("Ryan", "Julie", "Bob")

  • Die von asList erstellte ArrayList ist keine java.util.ArrayList, sondern teilt nur dieselbe. Tatsächlich kann dies nicht der Fall sein, da der Rückgabewert von asList als Liste mit fester Größe angegeben ist, eine ArrayList jedoch eine variable Größe haben muss.

    – Verdienst

    3. Mai 2010 um 20:38 Uhr

  • Ich stehe korrigiert. Ich habe nicht weit genug in die Quelle gelesen.

    – Fred Haslam

    4. Mai 2010 um 3:28 Uhr

Benutzer-Avatar
John D

Arrays.asList("Ryan", "Julie", "Bob");

Nun, in Java gibt es keine wörtliche Syntax für Listen, also müssen Sie .add() machen.

Wenn Sie viele Elemente haben, ist es ein bisschen ausführlich, aber Sie könnten entweder:

  1. Verwenden Sie Groovy oder ähnliches
  2. Verwenden Sie Arrays.asList (Array)

2 würde in etwa so aussehen:

String[] elements = new String[] {"Ryan", "Julie", "Bob"};
List list = new ArrayList(Arrays.asList(elements));

Dies führt jedoch zu einer unnötigen Objekterstellung.

Die ausgewählte Antwort lautet: ArrayList<Integer>(Arrays.asList(1,2,3,5,8,13,21));

Es ist jedoch wichtig zu verstehen, dass die ausgewählte Antwort die Elemente intern mehrmals kopiert, bevor das endgültige Array erstellt wird, und dass es eine Möglichkeit gibt, einen Teil dieser Redundanz zu reduzieren.

Beginnen wir damit, zu verstehen, was vor sich geht:

  1. Zuerst werden die Elemente in die kopiert Arrays.ArrayList<T> erstellt von der statischen Fabrik Arrays.asList(T...).

    Dies erzeugt nicht die gleiche Klasse wie java.lang.ArrayListtrotz des gleichen einfachen Klassennamens. Es implementiert keine Methoden wie remove(int) trotz einer List-Schnittstelle. Wenn Sie diese Methoden aufrufen, wird eine ausgelöst UnspportedMethodException. Aber wenn Sie nur eine Liste mit fester Größe brauchen, können Sie hier aufhören.

  2. Als nächstes die Arrays.ArrayList<T> konstruiert in #1 wird an den Konstruktor übergeben ArrayList<>(Collection<T>) bei dem die collection.toArray() -Methode aufgerufen, um sie zu klonen.

    public ArrayList(Collection<? extends E> collection) {
    ......
    Object[] a = collection.toArray();
    }
    
  3. Als nächstes entscheidet der Konstruktor, ob er das geklonte Array übernimmt oder es erneut kopiert, um den Unterklassentyp zu entfernen. Seit Arrays.asList(T...) intern ein Array vom Typ T verwendet, das gleiche, das wir als Parameter übergeben haben, lehnt der Konstruktor die Verwendung des Klons immer ab, es sei denn, T ist ein reines Objekt. (zB String, Integer, etc werden alle nochmal kopiert, weil sie Object erweitern).

    if (a.getClass() != Object[].class) {      
        //Arrays.asList(T...) is always true here 
        //when T subclasses object
        Object[] newArray = new Object[a.length];
        System.arraycopy(a, 0, newArray, 0, a.length);
        a = newArray;
    }
    array = a;
    size = a.length;
    

Daher wurden unsere Daten 3x kopiert, nur um die ArrayList explizit zu initialisieren. Wir könnten es auf 2x herunterbekommen, wenn wir Gewalt anwenden Arrays.AsList(T...) ein Objekt zu konstruieren[] array, damit ArrayList es später übernehmen kann, was wie folgt geschehen kann:

(List<Integer>)(List<?>) new ArrayList<>(Arrays.asList((Object) 1, 2 ,3, 4, 5));

Oder vielleicht ist es immer noch am effizientesten, die Elemente nach der Erstellung hinzuzufügen.

Benutzer-Avatar
Ken de Guzman

Wie wäre es mit diesem.

ArrayList<String> names = new ArrayList<String>();
Collections.addAll(names, "Ryan", "Julie", "Bob");

1358780cookie-checkArrayList-Initialisierung entspricht der Array-Initialisierung [duplicate]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy