JavaRush /Java-Blog /Random-DE /ArrayList-Klasse in Java

ArrayList-Klasse in Java

Veröffentlicht in der Gruppe Random-DE
Hallo! In früheren Vorlesungen haben wir eine solche Datenstruktur als Array im Detail untersucht und uns gängige Beispiele für die Arbeit damit angesehen. Diese Datenstruktur hat jedoch eine Reihe von Nachteilen. Die Antwort darauf in Java war das Erscheinen von ArrayList. Um es so einfach wie möglich auszudrücken: Eine ArrayList in Java ist ein „aktualisiertes“ Array mit vielen neuen Funktionen.Klasse ArrayList - 1

Wie unterscheidet sich Java Arraylist von regulären Arrays?

Im Allgemeinen sind Arrays recht praktisch und man kann, wie Sie bereits bemerkt haben, viele Dinge damit machen :) Allerdings haben Arrays auch eine Reihe von Nachteilen.
  • Begrenzte Größe. Sie müssen bereits beim Erstellen eines Arrays wissen, wie viele Zellen es enthalten soll. Wenn Sie die benötigte Menge unterschätzen, ist nicht genügend Platz vorhanden. Wenn Sie es überschätzen, bleibt das Array halb leer, und das ist nicht so schlimm. Schließlich stellt sich heraus, dass Sie dafür auch mehr Speicher zuweisen als nötig.
  • Ein Array verfügt über keine Methoden zum Hinzufügen von Elementen. Sie müssen immer explizit den Index der Zelle angeben, in der Sie das Element hinzufügen möchten. Wenn Sie versehentlich eine bereits belegte Zelle mit einem gewünschten Wert angeben, wird diese überschrieben.
  • Es gibt keine Methoden zum Entfernen eines Elements. Der Wert kann nur „auf Null gesetzt“ werden.
public class Cat {

   private String name;

   public Cat(String name) {
       this.name = name;
   }

   public static void main(String[] args) {

       Cat[] cats = new Cat[3];
       cats[0] = new Cat("Thomas");
       cats[1] = new Cat("Nilpferd");
       cats[2] = new Cat(„Philip Markowitsch“);

       cats[1] = null;



       System.out.println(Arrays.toString(cats));
   }

   @Override
   public String toString() {
       return "Cat{" +
               "name='" + name + '\'' +
               '}';
   }
}
Abschluss:

[Cat{name='Томас'}, null, Cat{name='Фoderпп Маркович'}]
Alle diese Mängel können mit ArrayList behoben werden. Es ist ganz einfach erstellt:
ArrayList<Cat> cats = new ArrayList<Cat>();
Jetzt haben wir eine Liste zum Speichern von Objekten erstellt Cat. Passt auf:Wir geben die Größe der ArrayList nicht an, da sie automatisch erweiterbar ist. Wie ist das möglich? Leicht. Sie werden überrascht sein, aber ArrayList basiert auf einem gewöhnlichen Array :) Ja, darin befindet sich ein Array, in dem unsere Elemente gespeichert sind. Aber ArrayList verfügt über einen speziellen Mechanismus, um damit zu arbeiten:
  • Wenn dieses interne Array voll ist, erstellt die ArrayList in sich selbst ein neues Array. Seine Größe = (Größe des alten Arrays * 1,5) +1.
  • Alle Daten werden vom alten Array in das neue kopiert
  • Das alte Array wird vom Garbage Collector entfernt.
Dank dieses Mechanismus implementiert eine ArrayList (im Gegensatz zu einem Array) eine Methode zum Hinzufügen eines neuen Elements. Das ist eine Methode add().
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<Cat>();
   cats.add(new Cat("Nilpferd"));
}
Das neue Element wird am Ende der Liste hinzugefügt. Jetzt besteht keine Gefahr eines Überlaufs, sodass dieser Mechanismus völlig sicher ist. Übrigens kann ArrayList nicht nur nach einem Objekt anhand des Index suchen, sondern auch umgekehrt – es kann den Index eines Objekts in der ArrayList anhand einer Referenz auf das Objekt finden! Dazu implementiert es die Methode indexOf(): Wir übergeben ihm einen Link zum gewünschten Objekt und indexOf()es gibt seinen Index an uns zurück:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   int thomasIndex = cats.indexOf(thomas);
   System.out.println(thomasIndex);
}
Abschluss:

0
Das ist richtig, das Objekt thomaswird tatsächlich in der Zelle gespeichert 0. Arrays haben nicht nur Nachteile, sondern zweifellos auch Vorteile. Einer von ihnen sucht nach einem Element anhand des Index. Da wir auf einen Index verweisen, also auf eine bestimmte Adresse im Speicher, ist eine solche Array-Suche sehr schnell. ArrayList in Java kann das auch! Dazu implementiert es eine Methode get():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat secondCat = cats.get(1);

   System.out.println(secondCat);
}
Abschluss:

Cat{name='Бегемот'}
Darüber hinaus können Sie leicht herausfinden, ob eine ArrayList ein bestimmtes Objekt enthält oder nicht. Dies geschieht mit der Methode contains():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.remove(pushok);
   System.out.println(cats.contains(pushok));
}
Die Methode prüft, ob das Element im internen Array der ArrayList enthalten ist, und gibt das Ergebnis in der Form boolean- trueoder zurück false. Abschluss:

false
Und noch etwas Wichtiges zum Einfügen. Mit ArrayList können Sie Daten nicht nur am Ende des Arrays, sondern auch per Index in jede beliebige Zelle einfügen. Dafür gibt es zwei Methoden:
  • add(int index, Cat element)
  • set(int index, Cat element)
An beide übergeben Sie den Index der Zelle, in die Sie einfügen möchten, und einen Link zum Objekt selbst. Der Unterschied besteht darin, dass beim Einfügen set()der alte in der Zelle gespeicherte Wert überschrieben wird. Und wenn Sie „through add()first“ einfügen, werden alle Elemente beginnend bis [index]zum Ende des Arrays verschoben und das benötigte Objekt zur resultierenden leeren Zelle hinzugefügt. Hier ist ein Beispiel:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.set(0, philipp);//Jetzt haben wir eine Liste mit 2 Katzen. Wir fügen den 3. Via-Satz hinzu:

   System.out.println(cats.toString());
}
Abschluss:

[[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фoderпп Маркович'}, Cat{name='Бегемот'}]
Wir hatten eine Liste mit 2 Katzen, eine weitere haben wir über die Methode set()in die Zelle eingefügt 0. Dadurch wurde der in dieser Zelle gespeicherte alte Wert durch einen neuen ersetzt.
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);

   System.out.println(cats.toString());

   cats.add(0, philipp);//Jetzt haben wir eine Liste mit 2 Katzen. Fügen Sie den dritten über Hinzufügen hinzu

   System.out.println(cats.toString());
}
Aber es add()funktionierte anders. Er verschob alle Elemente nach rechts und schrieb dann den neuen Wert in die Zelle 0. Abschluss:

[Cat{name='Томас'}, Cat{name='Бегемот'}]
[Cat{name='Фoderпп Маркович'}, Cat{name='Томас'}, Cat{name='Бегемот'}]
Um die Liste vollständig zu löschen, verwenden Sie die Methode clear():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();
   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   cats.clear();

   System.out.println(cats.toString());
}
Abschluss:

[]
Alle Inhalte wurden aus der Liste entfernt. Achtung: Im Gegensatz zu Arrays wird in ArrayList die Methode toString() überschrieben und zeigt die Liste sofort im String-Format an. Im Fall von Arrays mussten wir hierfür die Klasse Arrays verwenden. Und da wir uns an Arrays erinnern: In Java kann man problemlos zwischen einem Array und einer ArrayList „wechseln“, also das eine in das andere konvertieren. Die Arrays-Klasse verfügt hierfür über eine Methode, Arrays.asList(). Mit seiner Hilfe erhalten wir den Inhalt des Arrays als Liste und übergeben ihn an den Konstruktor unserer ArrayList:
public static void main(String[] args) {

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   Cat[] catsArray = {thomas, behemoth, philipp, pushok};

   ArrayList<Cat> catsList = new ArrayList<>(Arrays.asList(catsArray));
   System.out.println(catsList);
}
Abschluss:

[Cat{name='Томас'}, Cat{name='Бегемот'}, Cat{name='Фoderпп Маркович'}, Cat{name='Пушок'}]
Sie können das Gegenteil tun – ein Array von einem ArrayList-Objekt abrufen. Verwenden Sie dazu die Methode toArray():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();

   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   Cat[] catsArray = cats.toArray(new Cat[0]);

   System.out.println(Arrays.toString(catsArray));
}
Bitte beachten Sie: Wir haben ein leeres Array an die toArray()-Methode übergeben. Es ist kein Fehler. Innerhalb der ArrayList-Klasse ist diese Methode so implementiert, dass die Übergabe eines leeren Arrays ihre Leistung erhöht. Merken Sie sich dies vorerst nur für die Zukunft (Sie können aber auch eine bestimmte Größe übertragen, das wird funktionieren). Apropos Größe. Die aktuelle Größe der Liste kann mit der Methode ermittelt werden size():
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>();


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
Hier ist es wichtig zu verstehen, dass lengthdie Methode ArrayList.size() im Gegensatz zur Array-Eigenschaft genau die Anzahl der Elemente zurückgibt und nicht die anfängliche Kapazität, da wir diese beim Erstellen der ArrayList nicht angeben. Eine Angabe ist übrigens grundsätzlich möglich. ArrayList verfügt über einen entsprechenden Konstruktor. Aber sein Verhalten in Bezug auf das Hinzufügen neuer Elemente wird sich nicht ändern:
public static void main(String[] args) {

   ArrayList<Cat> cats = new ArrayList<>(2);//Erstelle eine ArrayList mit einer Anfangskapazität von 2


   Cat thomas = new Cat("Thomas");
   Cat behemoth = new Cat("Nilpferd");
   Cat philipp = new Cat(„Philip Markowitsch“);
   Cat pushok = new Cat("Flaum");

   cats.add(thomas);
   cats.add(behemoth);
   cats.add(philipp);
   cats.add(pushok);

   System.out.println(cats.size());
}
Konsolenausgabe:

4
Wir haben eine Liste mit zwei Elementen erstellt, die sich jedoch bei Bedarf problemlos erweitern ließ. Eine andere Sache ist, dass, wenn wir zunächst eine sehr kleine Liste erstellt haben, die Erweiterungsoperation häufiger durchgeführt werden muss, was eine gewisse Menge an Ressourcen verbraucht. In dieser Vorlesung haben wir den Prozess des Entfernens von Elementen aus einer ArrayList kaum berührt. Das liegt natürlich nicht an Vergesslichkeit. Dieses Thema wurde in eine separate Vorlesung aufgeteilt, die Sie weiterlesen können :)
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION