[JAVA] Informationen zu removeAll und RetainAll von ArrayList

Der Auslöser war Ich habe die Quelle von ArrayList gelesen. Ich habe geschrieben, woran ich interessiert war ich habe die Quelle von ArrayList gelesen, aber ich habe es weiter gelesen und war interessiert ist. Oder besser gesagt, es ist so lang, dass ich nicht alles auf einmal lesen kann ...

Informationen zu removeAll und RetainAll von ArrayList

Hatte ArrayList übrigens Methoden wie removeAll und RetainAll? Wenn Sie sich Javadoc sofort ansehen, gibt es keine. Ich schaue immer JDK 6. Wenn Sie sich also JDK 7 ansehen. Aber die Methode hat @since 1.7 nicht! !! !! Nun, ich denke, dass @since in der Sun Micro-Ära mit jeder Methode verbunden war, aber ist es jetzt angemessen?

Wenn Sie einen zweiten Blick auf die Quelle werfen, handelt es sich tatsächlich um batchRemove. Dieser Kommentar hat mich besonders interessiert. "Aber ich rolle den Inhalt nicht zurück. 』\

In javadoc steht geschrieben, dass batchRemove nullpo und removeAll und keepAll nullpo ausgibt, wenn c.contains nullpo ausgibt. Nun, es ist in Ordnung, wenn die Spezifikation lautet, dass eine Ausnahme auftritt, aber das Problem ist, dass die Daten korrigiert werden, bis null in der Liste angezeigt wird, und nach null wird die Ausnahme mit den Daten so angezeigt, wie sie sind, was nicht zumutbar ist! Wenn Sie eine Ausnahme erhalten, kehren Sie zu den Originaldaten zurück.

Wann wird enthält überhaupt nullpo?

Laut Sammlungen enthält NullPointerException - Wenn das angegebene Element null ist und diese Auflistung keine Nullelemente zulässt (optional) Es scheint, dass. Natürlich enthält ArrayList null. Daher führt die Übergabe von ArrayList an removeAll und RetainAll nicht zu nullpo.

Was ist also eine Sammlung, die keine Nullen zulässt? suchte nach. Das ist zum Beispiel TreeSet. Laut TreeSet enthält "NullPointerException - wenn das angegebene Element null ist und diese Menge eine natürliche Reihenfolge verwendet oder der Komparator keine Nullelemente zulässt"

Mit anderen Worten, wenn Sie für eine ArrayList, die null enthält, ein TreeSet an removeAll oder keepAll übergeben, wird ein Nullpunkt angezeigt und die Daten befinden sich auf halber Strecke.

Was möchten Sie überhaupt mit removeAll und keepAll tun?

Vergessen Sie die aktuelle Spezifikation, dass Nurpo herauskommen wird. Was möchte das Original entfernen, um alle zu entfernen und alle beizubehalten? removeAll möchte die angegebene Sammlung entfernen, keepAll möchte die angegebene Sammlung behalten. Ich denke nicht, dass es wirklich wichtig ist, ob die Sammlung Nullen zulässt oder nicht.

Mit anderen Worten, wenn Sie eine Sammlung übergeben, die nicht zulässt, dass nullAll entfernt, wird null niemals darin enthalten, sodass null in ArrayList unverändert bleibt. Im Gegenteil, wenn Sie eine Sammlung übergeben, die nicht zulässt, dass nullAll behält, verschwindet die Null in ArrayList immer, da sie niemals null enthält.

Lass es uns umschreiben

Fügen Sie c.contains in try-catch ein. Wenn komplement == false in catch, elementData [w ++] = elementData [r];

for (; r < size; r++) {
    try {
        if (c.contains(elementData[r]) == complement)
            elementData[w++] = elementData[r];
    } catch (NullPointerException e) {
        if (!complement)
            elementData[w++] = elementData[r];
    }
}
~~~

Danach ist es nicht mehr nötig.
r ==Weil es auf Größe schleift, wenn(r != size) {Das ist nicht nötig.
if (w != size) {Bleibt wie es ist.

Neben ArrayList scheint es natürlich viel AbstractCollection zu geben und so weiter.


##Bonus

『L.499-500 System.arraycopy()Dann frage ich mich, ob src und dst richtig evakuiert sind. Andernfalls überschreibt dieser Code den Index, den Sie später kopieren.
System.arraycopy(elementData, index+1, elementData, index, numMoved);』

Wie erwartet wird das JDK in der Welt so etwas natürlich in Betracht ziehen.
(Das? SrcPos>Da es sich um dstPost handelt, ist es kein Problem, es von vorne zu kopieren. srcPos<Wenn Sie in dstPos von vorne kopieren, überschreibt es sich selbst. Kopieren Sie also von hinten.

Eine Beschreibung der Systemarraykopie.
"Wenn die Argumente src und dest dasselbe Array-Objekt sind, z. B. zuerst srcPos bis srcPos+length-Kopieren Sie die Elemente an Position bis 1 in ein temporäres Array mit einer Anzahl von Elementen der Länge und verschieben Sie dann den Inhalt des temporären Arrays von destPos zu destPos im Zielarray.+length-Kopieren nach 1. 』\

Yeah yeah ehhhhh. Es ist eine Lüge. Ich kopiere es vorübergehend. Sind Sie im Ernst. Kopieren Sie auch mit dem Z80 von vorne(LDIR)Und von hinten kopieren(LDDR)Ich bereite mich vor.
[Z80/Blockanweisung](https://ja.wikipedia.org/wiki/Z80#.E3.83.96.E3.83.AD.E3.83.83.E3.82.AF.E5.91.BD.E4.BB.A4)

Dies bedeutet, dass wenn dasselbe Array verwendet wird, es zweimal kopiert wird, so dass es speichereffizienter ist, selbst eine Schleife zu erstellen und die Kopie von vorne und die Kopie von hinten bedingt zu verzweigen. Es ist ein Ärger.
ArrayList.add(int,E)Oder ArrayList.remove(int)Normalerweise kopiere ich ein Array. Nun, ich benutze es nicht so.


Recommended Posts

Informationen zu removeAll und RetainAll von ArrayList
Über Biocontainer fastqc und Java
Informationen zur Funktionsweise von next () und nextLine ()
LinkedList und ArrayList
Denken Sie an die Kombination von Servlet und Ajax
Informationen zum Aufruf-Timing und zu den Argumenten der addToBackStack-Methode
Informationen zu next () und nextLine () der Scannerklasse
ArrayList und die Rolle der Schnittstelle aus List
Informationen zum Trennen () von HttpURLConnection
Über Bean und DI
Über Klassen und Instanzen
Über die Auswahl von OpenJDK
Über DI des Frühlings ①
Über bekommt und bekommt.chomp
Über DI des Frühlings ②
Das Verhalten unterscheidet sich zwischen new und clear () von ArrayList
Über Weiterleiten und Weiterleiten
[Java] Über Objects.equals () und Überprüfung des String-Vergleichs (== und gleich)
Über Kapselung und Vererbung
[Technisches Memo] Über die Vor- und Nachteile von Ruby
Informationen zu Serializable und serialVersionUID
Informationen zum Formular. ○○ von form_with
[Java] Struktur der Auflistungsklasse festlegen (zu HashSet und TreeSet)
Java-Anfänger fassten das Verhalten von Array und ArrayList kurz zusammen
[Java] Ich habe über die Vorzüge und Verwendungen von "Schnittstelle" nachgedacht.
Über den Umgang mit Null
Über für Anweisung und wenn Anweisung
Über Java-Instanzen
Einrichten von JMeter und jEnv
Hintergrund und Mechanismus des Stoffladers
Über synchronisierte und Wiedereintrittssperre
Zusammenfassung von FileInputStream und BufferedInputStream
Informationen zur Beschreibung von Docker-compose.yml
Über Größenvergleich von compareTo
Kombination von Suche und jedem_mit_Index
Informationen zu Arten der Codeabdeckung
Urteil von JSONArray und JSONObject
Über Ruby-Hashes und -Symbole
[Java] Über String und StringBuilder
Über Klassen und Instanzen (Evolution)
Über die Zupfmethode und die ID-Methode
Überlegungen zu Klassen und Instanzen
Unterschied zwischen ArrayList und LinkedList
Memorandum über LOD.
Rest- und Leistungstreiber (冪 Leistung)
Unterschied zwischen List und ArrayList
Vor- und Nachteile von Java
Über Java-Paket und Import
Über Ruby und Objektmodell
Informationen zu Ruby-Klassen und -Instanzen
Über Instanzvariablen und attr_ *
Über teilweise Übereinstimmung des Selektors
Über verschiedene Eindrücke von "Testen von Java Microservices" und Consumer Driven Contract