Ich bin ein neuer Diplomingenieur bei einer bestimmten Webfirma. Ich entwickle hauptsächlich täglich Android.
Neulich stürzte sich Herr Mentor auf den folgenden Java-Code (Android).
ArrayList<Hoge> hoges = new ArrayList<>();
Mentor "Warum werden Schweine in ArrayList deklariert? Warum nicht in die Liste aufnehmen?"
Auf Nachfrage konnte ich nicht antworten.
Eine ArrayList ist erforderlich, um mehrere Hoge-Instanzen zu speichern, und es ist natürlich, dass die Variable, die die ArrayList enthält, in der ArrayList deklariert ist. .. ..
Nachdem ich die Erklärung erhalten hatte, war ich von mir selbst überzeugt und möchte sie für mein eigenes Verständnis zusammenfassen.
Zunächst werde ich die Beziehung zwischen List und ArrayList zusammenfassen.
List Liste ist eine Schnittstelle. Die Schnittstelle ist eine Reihe von Spezifikationen für die Methoden einer Klasse, und die Liste ist eine Spezifikation für die Methoden, die zum Realisieren einer Sammlung erforderlich sind.
Betrachten Sie den Inhalt der Quelle (Auszug nur einiger Methoden)
public interface List<E> extends Collection<E> {
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
boolean add(E e);
boolean remove(Object o);
boolean equals(Object o);
・
・
・
etc...
Und so weiter werden die Methoden ohne Logik zusammengestellt.
ArrayList ArrayList ist ein Auszug aus der Quelle (nur derjenige, der der obigen Methode der Liste entspricht)
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
{
public int size() {
if (ArrayList.this.modCount != this.modCount)
throw new ConcurrentModificationException();
return this.size;
}
public boolean isEmpty() {
return size == 0;
}
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
public Iterator<E> iterator() {
return listIterator();
}
public boolean add(E e) {
ensureCapacityInternal(size + 1); // Increments modCount!!
elementData[size++] = e;
return true;
}
public boolean remove(Object o) {
if (o == null) {
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
fastRemove(index);
return true;
}
} else {
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
fastRemove(index);
return true;
}
}
}
return false;
}
public boolean contains(Object o) {
return indexOf(o) >= 0;
}
・
・
・
etc...
Wie Sie sehen können, wird der Prozess in der Klasse, die die List-Schnittstelle implementiert, in der Methode beschrieben, die nicht in List enthalten war. Wie Sie nach den Implementierungen sehen können, verfügt ArrayList über verschiedene andere Methoden, da es RandomAccess, Cloneable, java.io.Serializable sowie List implementiert.
Übrigens gibt es neben ArrayList viele Klassen, die List implementieren, wie z. B. Stack, Vector und LinkedList. ArrayList ist eine der Klassen, die die von List definierten Methoden implementiert.
Die Geschichte ist etwas abweichend, aber was ist der Vorteil der Implementierung der tatsächlichen Verarbeitung auf der Seite der Implementierungsklasse, da die Methodenspezifikationen zusammengefasst sind?
Der Punkt ist, dass der Aufrufer der Klasse den Inhalt der Implementierung nicht kennen muss. Zum Beispiel, wenn Sie die folgende Schnittstelle haben:
public interface FileReader {
void open();
void close();
void read();
}
Nehmen wir an, dass CSVFileReader und JSONFileReader diesen FileReader implementieren.
public class CSVFileReader {
public void open() {
Verarbeitung, um CSV schön zu öffnen
}
public void close() {
Verarbeitung, die csv schön schließt
}
public void read() {
Verarbeitung, die CSV gut liest
}
}
public class JSONFileReader {
public void open() {
Verarbeitung, um JSON gut zu öffnen
}
public void close() {
Verarbeitung, die JSON gut schließt
}
public void read() {
Verarbeitung, die JSON gut liest
}
}
Angenommen, Sie haben eine Methode, die diese Klassen als Argumente verwendet und die Anzahl der Zeichen in der Datei zählt.
public int getCount(FileReader fileReader) {
int count = 0;
while(true) {
fileReader.read();
//Angenommen, hier gibt es eine Logik zum Verlassen der Schleife, wenn die Endbedingung erfüllt ist
count++;
}
return count;
}
Die Schnittstelle definiert nur die Methode und kann nicht instanziiert werden. Sie können es jedoch als Typ deklarieren.
Mit anderen Worten, unabhängig von der Implementierung von read () können Sie eine Klasse verwenden, die FileReader implementiert, solange Sie den Aufrufer read () kennen. Der Anrufer muss nicht wissen, ob der zu lesende Inhalt CSV oder JSON ist.
Auf diese Weise wird der Mechanismus, der die aufrufende Logik vereinheitlicht, dh eine gemeinsame Hauptroutine erstellt, als Polymorphismus bezeichnet.
Ich habe die Beziehung zwischen List und ArrayList zusammengefasst
Vorhin
ArrayList<Hoge> hoges = new ArrayList<>();
Überlegen Sie, wie Sie schreiben sollen.
Nach der Idee des Polymorphismus,
List<Hoge> hoges = new ArrayList<>();
Kann geschrieben werden.
ArrayList-Methode
boolean add(E e);
boolean remove(Object o);
boolean equals(Object o);
Usw. werden in List als Schnittstellen definiert und implementiert. Zum Beispiel
List<Hoge> hoges = new LinkedList<>();
Und selbst wenn Sie eine Instanz von LinkedList in Hoges speichern
hoges.add(hoge);
Sie können dieselbe Methode wie folgt aufrufen. Wie ich zuvor in den Vorteilen der Schnittstelle erklärt habe, Wenn Sie eine Methode haben, die eine Liste als Argument verwendet, können Sie sie in ArrayList, LinkedList oder Stack empfangen, wodurch Sie mehr Flexibilität erhalten.
natürlich,
ArrayList<Hoge> hoges = new ArrayList<>();
Das bedeutet nicht, dass das Schreiben völlig nutzlos ist. Natürlich implementiert ArrayList auch RandomAccess, Cloneable, java.io.Serializable. Wenn Sie die darin definierten Methoden verwenden müssen, müssen Sie sie in ArrayList deklarieren.
Andernfalls
List<Hoge> hoges = new ArrayList<>();
Es wäre besser zu schreiben.
Wenn Sie nach List und ArrayList suchen,
List<Hoge> hoges = new ArrayList<>();
Ich kann einen Artikel finden, der sagt, dass das besser ist, Ich denke, das Wichtigste hier ist nicht, sich das Ganze zu merken, sondern zu erklären, warum Sie diese Erklärung abgeben.
Dieses Mal habe ich List und ArrayList als Beispiele verwendet und die Gründe dafür zusammengefasst.
Ich denke, es gibt immer noch viele seltsame Dinge beim Lernen von Java. Tsukkomi, wir freuen uns von Ihnen zu hören.
Grundlagen von Java, die in 3 Minuten verstanden werden können] Ich habe versucht, die Unterschiede zwischen List und ArrayList zusammenzufassen http://www.sejuku.net/blog/14886
Unterschied zwischen Java, List und ArrayList. http://piyopiyocs.blog115.fc2.com/blog-entry-219.html
List(JavaPlatform SE 7) http://docs.oracle.com/javase/jp/7/api/java/util/List.html
Was ist eine Schnittstelle? -Die Rolle unterscheidet sich von der Vererbung- | Lassen Sie uns die objektorientierte Programmierung (OOP) überprüfen (3) https://www.gixo.jp/blog/5159/
Akira Hirasawa Warum es objektorientiert machen 2. Auflage Nikkei BP
Recommended Posts