[JAVA] À propos de removeAll et de retentionAll de ArrayList

Le déclencheur était J'ai lu la source de ArrayList. J'ai écrit ce qui m'intéressait j'ai lu la source de ArrayList, mais je voulais en savoir plus est. Ou plutôt, c'est tellement long que je ne peux pas tout lire à la fois ...

À propos de removeAll et de retentionAll de ArrayList

Au fait, ArrayList avait-il des méthodes telles que removeAll et retentionAll? Si vous regardez javadoc immédiatement, il n'y en a pas. Je regarde toujours JDK 6. Donc, si vous regardez JDK 7. Mais la méthode n'a pas @since 1.7! !! !! Eh bien, je pense que @since était attaché à chaque méthode à l'époque de Sun Micro, mais est-ce approprié maintenant?

Si vous regardez à nouveau et regardez la source, il s'agit en fait de batchRemove. J'ai été particulièrement intéressé par ce commentaire. «Mais je ne reviens pas sur le contenu. 』\

Il est écrit en javadoc que lorsque c.contains émet nullpo, batchRemove émet nullpo et removeAll et holdAll émettent nullpo. Eh bien, ce n'est pas grave si c'est une spécification qu'une exception se produira, mais le problème est que les données sont corrigées jusqu'à ce que null apparaisse dans la liste, et après null, l'exception apparaît avec les données telles quelles! Si vous obtenez une exception, revenez aux données d'origine.

Quand contient devient-il nullpo en premier lieu?

Selon les collections contient NullPointerException-Si l'élément spécifié est nul et que cette collection n'autorise pas les éléments nuls (facultatif) Il paraît que. Bien sûr, ArrayList contient null. Par conséquent, passer ArrayList à removeAll et retentionAll ne produit pas nullpo.

Alors, qu'est-ce qu'une collection qui n'autorise pas les valeurs nulles? cherché. Par exemple, c'est TreeSet. Selon TreeSet contient "NullPointerException-si l'élément spécifié est nul et que cet ensemble utilise un ordre naturel ou si son comparateur n'autorise pas les éléments nuls"

En d'autres termes, pour un ArrayList contenant null, si vous passez un TreeSet à removeAll ou retentionAll, un point nul apparaîtra et les données seront à mi-chemin.

Que voulez-vous faire avec removeAll et retentionAll en premier lieu?

Oubliez la spécification actuelle que Nurpo sortira, que veulent faire le removeAll original et le retentionAll? removeAll veut supprimer la collection spécifiée, retentionAll veut conserver la collection spécifiée. Je ne pense pas que ce soit vraiment important que la collection autorise NULL ou non.

En d'autres termes, lorsque vous transmettez une collection qui n'autorise pas les valeurs nulles à removeAll, les valeurs nulles dans ArrayList restent telles qu'elles sont car elles ne sont jamais incluses. Au contraire, lorsque vous transmettez une collection qui n'autorise pas null à conserverAll, le null dans ArrayList disparaît toujours car il ne contient jamais null.

Réécrivons-le

Insérez c.contains dans try-catch. Si complément == false dans 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];
    }
}
~~~

Pas besoin de finalement après ça.
r ==Parce qu'il boucle à la taille, si(r != size) {Ce n'est pas nécessaire.
if (w != size) {Reste tel quel.

Bien sûr, en plus de ArrayList, il semble y avoir beaucoup de AbstractCollection et ainsi de suite.


##prime

『L.499-500 System.arraycopy()Ensuite, je me demande si src et dst sont correctement évacués. Sinon, ce code écraserait l'index que vous copiez plus tard.
System.arraycopy(elementData, index+1, elementData, index, numMoved);』

Comme prévu, le JDK dans le monde envisagera naturellement une telle chose.
(C'est? SrcPos>Puisqu'il s'agit de dstPost, il n'y a aucun problème à le copier depuis l'avant. srcPos<Si vous copiez à partir de l'avant dans dstPos, il s'écrasera, donc copiez à l'arrière)

Une description de la copie du tableau système.
"Si les arguments src et dest sont le même objet de tableau, par exemple, d'abord srcPos à srcPos+length-Copiez les éléments en position jusqu'à 1 dans un tableau temporaire avec un certain nombre d'éléments de longueur, puis déplacez le contenu du tableau temporaire de destPos vers destPos dans le tableau de destination.+length-Copier vers 1. 』\

Ouais ouais ehhhhh. C'est un mensonge. Je le copie temporairement. Es-tu sérieux. Copiez de l'avant même avec ce Z80(LDIR)Et copier par derrière(LDDR)Je prépare.
[Z80/Instruction de bloc](https://ja.wikipedia.org/wiki/Z80#.E3.83.96.E3.83.AD.E3.83.83.E3.82.AF.E5.91.BD.E4.BB.A4)

Cela signifie que si le même tableau est utilisé, il sera copié deux fois, il est donc plus efficace de faire une boucle par vous-même et de dériver conditionnellement la copie depuis l'avant et la copie depuis l'arrière. C'est un problème.
ArrayList.add(int,E)Ou ArrayList.remove(int)Je fais généralement une copie de tableau. Eh bien, je ne l'utilise pas comme ça.


Recommended Posts

À propos de removeAll et de retentionAll de ArrayList
À propos de Biocontainers fastqc et Java
À propos du fonctionnement de next () et nextLine ()
LinkedList et ArrayList
Pensez à la combinaison de Servlet et Ajax
À propos de la synchronisation des appels et des arguments de la méthode addToBackStack
À propos de next () et nextLine () de la classe Scanner
ArrayList et le rôle de l'interface vu depuis List
À propos de disconnect () de HttpURLConnection
À propos de Bean et DI
À propos des classes et des instances
À propos de la sélection d'OpenJDK
À propos de DI of Spring ①
À propos de gets et gets.chomp
À propos de DI of Spring ②
Le comportement est différent entre new et clear () de ArrayList
À propos de la redirection et du transfert
[Java] À propos de Objects.equals () et examen de la comparaison de chaînes (== et égal à)
À propos de l'encapsulation et de l'héritage
[Note technique] À propos des avantages et des inconvénients de Ruby
À propos de Serializable et serialVersionUID
À propos de form. ○○ de form_with
[Java] Définit la structure de la classe de collection (à propos de HashSet et TreeSet)
Les débutants en Java ont brièvement résumé le comportement de Array et ArrayList
[Java] J'ai réfléchi aux mérites et aux utilisations de "interface"
À propos de la gestion de Null
À propos de l'instruction et de l'instruction if
À propos des instances Java
Configuration de JMeter et jEnv
Contexte et mécanisme de Fabric-loader
À propos du verrouillage synchronisé et réentrant
Résumé de FileInputStream et BufferedInputStream
À propos de la description de Docker-compose.yml
À propos de la comparaison de taille de compareTo
Combinaison de recherche et each_with_index
À propos des types de couverture de code
Jugement de JSONArray et JSONObject
À propos des hachages et symboles Ruby
[Java] À propos de String et StringBuilder
À propos des classes et des instances (évolution)
À propos de la méthode Pluck et de la méthode ID
Prise en compte des classes et des instances
Différence entre ArrayList et LinkedList
Mémorandum sur LOD.
Opérateur résiduel et puissance (冪 puissance)
Différence entre List et ArrayList
Avantages et inconvénients de Java
À propos du package Java et de l'importation
À propos de Ruby, modèle objet
À propos des classes et des instances Ruby
À propos des variables d'instance et attr_ *
À propos de la correspondance partielle du sélecteur
À propos des impressions diverses de "Test des microservices Java" et du contrat axé sur le consommateur