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 ...
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.
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.
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.
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