[JAVA] ArrayList und die Rolle der Schnittstelle aus List

Ich bin ein neuer Diplomingenieur bei einer bestimmten Webfirma. Ich entwickle hauptsächlich täglich Android.

Der Anfang der Sache an erster Stelle

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.

List und ArrayList

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.

Was macht Sie mit der Benutzeroberfläche zufrieden?

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.

Warum mit diesem Typ deklarieren?

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.

Zusammenfassung

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.

Referenz

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

ArrayList und die Rolle der Schnittstelle aus List
[Java] Inhalt der Collection-Schnittstelle und der List-Schnittstelle
Java-Sprache aus der Sicht von Kotlin und C #
Extrahieren Sie ein bestimmtes Element aus der Liste der Objekte
Unterschied zwischen List und ArrayList
Java-Anfänger fassten das Verhalten von Array und ArrayList kurz zusammen
Aggregieren Sie die Anzahl der Personen alle 10 Jahre aus Liste <Person>
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.
[Java] Löschen Sie die Elemente von List
Extrahieren Sie effizient mehrere Elemente zufällig und ohne Duplizierung aus der Liste
Ich habe die Quelle von ArrayList gelesen, die ich gelesen habe
Dies und das von JDK
Informationen zur Rolle der Initialisierungsmethode
Informationen zu removeAll und RetainAll von ArrayList
Vom jungen Java (3 Jahre) bis zu Node.js (4 Jahre). Und der Eindruck, nach Java zurückzukehren
Bestätigung und Umgestaltung des Flusses von der Anfrage zum Controller in [httpclient]
[Einführung in Ruby] Über die Rolle von true und break in der while-Anweisung
Vergleich von null-toleranten, null-toleranten und null-toleranten sicheren Typen aus der Perspektive der Null-Sicherheit
Ich habe versucht, die Grammatik von R und Java zu übersetzen [Von Zeit zu Zeit aktualisiert]
Bedeutung der aus der Java Collection gelernten Schnittstelle
[Herausforderung CircleCI von 0] Lernen Sie die Grundlagen von CircleCI
Ein- und Ausklappen des Inhalts der Recycler-Ansicht
Informationen zur Funktionsweise von next () und nextLine ()
[Docker von 0 herausfordern] Übersicht und Bedingungen von Docker
Die Geschichte von RxJava, das unter NoSuchElementException leidet
Finden Sie das Durchschnittsalter aus Liste <Person>.
[Java / Swift] Vergleich von Java-Schnittstelle und Swift-Protokoll
So sortieren Sie eine Liste von SelectItems
Richtige Verwendung der Schnittstelle und der abstrakten Klasse
[Java 7] Teilen Sie die Java-Liste und führen Sie den Prozess aus
Finden Sie den Unterschied von einem Vielfachen von 10
Überprüfen Sie die Funktion der Schnittstelle über den Thread
Geben Sie die Summe jedes Namens und seines Inhalts aus dem Mehrfacharray aus
Ich möchte rekursiv die Oberklasse und die Schnittstelle einer bestimmten Klasse erhalten
[No.004] Der Bestelllistenbildschirm des Bestellers wurde korrigiert
Hat sich der Inhalt von useBodyEncodingForURI von Tomcat8 geändert?
Überprüfen Sie die installierte und aktivierte JDK-Version
Denken Sie an die Kombination von Servlet und Ajax
Vergleichen Sie die Geschwindigkeit der for-Anweisung und der erweiterten for-Anweisung.
[Java] Der verwirrende Teil von String und StringBuilder
Ich habe die Eigenschaften von Java und .NET verglichen
Lernen Sie den rudimentären Mechanismus und die Verwendung von Gradle 4.4 kennen
Informationen zu next () und nextLine () der Scannerklasse
Was sind die Vorteile von DI und Thymeleaf?
Extrahiert den Wert von HashMap und gibt das nach dem Wert von value sortierte Ergebnis als Liste zurück.
Einfache statistische Analyse des Geldbetrags aus der von der Mercari Java-Entwicklung durchsuchten Liste
Teilen Sie in beliebige Zahlen von der Breite und Länge von Nord, Süd, Ost und West