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