Traitement de la collecte


1. [Obligatoire] Concernant le traitement du hashCode et des égal, suivez les règles suivantes :

1) Tant que l'égal est réécrit, le hashCode doit être réécrit.

2) Étant donné que Set stocke des objets uniques et est jugé en fonction du hashCode et de ses égaux, les

objets stockés dans Set doivent remplacer ces deux méthodes.

3) Si un objet personnalisé est utilisé comme clé de carte, hashCode et égal doivent être remplacés.

Exemple positif : String remplace les méthodes hashCode et equals, nous pouvons donc volontiers utiliser les objets String comme clés.


2. [Obligatoire] Le résultat subList de ArrayList ne peut pas être converti en ArrayList, sinon une ClassCastException sera levée : java util . subList renvoie la classe interne SubList de ArrayList, qui n'est pas ArrayList, mais une vue de ArrayList Toutes les opérations sur la sous-liste SubList seront finalement reflétées sur la liste d'origine.

3. [Obligatoire] Dans le scénario de sous-liste, portez une attention particulière aux modifications apportées au nombre d'éléments dans la collection d'origine, ce qui entraînera la génération d'exceptions ConcurrentModificationException lors du parcours, de l'ajout et de la suppression de la sous-liste.


4. [Obligatoire] Pour utiliser la méthode de conversion d'un ensemble en tableau, vous devez utiliser le tableau toArray(T[]) de l'ensemble. L'entrée est un tableau exactement du même type, et la taille est la liste size().


Contre-exemple :

Il y a un problème avec l'utilisation directe de la méthode sans paramètre toArray. La valeur de retour de cette méthode ne peut être que la classe Object[]. Si vous forcez le cast d'autres tableaux de type

, une erreur ClassCastException se produira. .

Exemple positif :

List<String> list = new ArrayList<String>(2);
list.add("guan");
list.add("bao");
String[] array = new String[list.size()];
array = list.toArray(array);
Explication :

Utilisez la méthode toArray avec des paramètres. Lorsque l'espace du tableau alloué par le paramètre d'entrée n'est pas assez grand, la méthode toArray réaffectera en interne

l'espace mémoire et renverra le nouveau tableau. adresse; si l'élément du tableau S'il est plus grand que ce qui est réellement requis, les éléments du tableau avec l'indice [ list . size() ] seront définis sur null et les autres éléments du tableau conserveront leurs valeurs d'origine. Il est préférable de définir la taille du groupe de paramètres et le nombre d'éléments de collection

dans la méthode cohérente. 5. [Obligatoire] Lorsque vous utilisez la classe d'outils Arrays. asList() pour convertir un tableau en collection, vous ne pouvez pas utiliser ses méthodes pour modifier la collection. Ses méthodes d'ajout/suppression/effacement lanceront une exception UnsupportedOperationException. .

Remarque : L'objet de retour d'asList est une classe interne Arrays et n'implémente pas la méthode de modification de collection. Arrays. asList incarne le mode adaptateur, qui convertit uniquement l'interface, et les données d'arrière-plan sont toujours un tableau.

String[] str = new String[] { "a", "b" };
List list = Arrays.asList(str);

Le premier cas : list.add("c"); Exception d'exécution.

Deuxième cas : str[0]= "gujin"; alors list.get(0) sera également modifié en conséquence.


6. [Obligatoire] Utilisez le caractère générique <? extends T > pour recevoir les données renvoyées. La méthode add ne peut pas être utilisée pour les collections génériques écrites de cette manière.

Remarque : Après avoir emballé les pommes, un objet <? extends Fruits > est renvoyé. Cet objet ne peut pas ajouter de fruits, y compris pommes.


7. [Obligatoire] N'effectuez pas d'opérations de suppression/ajout sur les éléments de la boucle foreach. Veuillez utiliser la méthode Iterator

pour supprimer des éléments. Si vous opérez simultanément, vous devez verrouiller l'objet Iterator.

Contre-exemple :

List<String> a = new ArrayList<String>();
a.add("1");
a.add("2");
for (String temp : a) {
if("1".equals(temp)){
a.remove(temp);
}
}

Explication : Le résultat de l'exécution du code ci-dessus sera certainement au-delà des attentes de tout le monde, alors essayez de remplacer "1" par "2", est-ce que ce sera le mêmerésultat ?

Exemple positif :

Iterator<String> it = a.iterator();
while(it.hasNext()){
String temp = it.next();
if(删除元素的条件){
it.remove();
}
}

8. [Obligatoire] Dans JDK 7 et supérieur, Comparator doit satisfaire la réflexivité, la transitivité et la symétrie, sinon Arrays.sort,

Collections.sort signalera une exception IllegalArgumentException.

Explication :

1) Réflexivité : Le résultat de la comparaison de x et y est opposé au résultat de la comparaison de y et x.

2) Transitivité : x > y , y >

3) Symétrie : x = y, alors les résultats de comparaison de x et z sont les mêmes que les résultats de comparaison de y et z.

Contre-exemple : L'exemple suivant ne gère pas la situation d'égalité et des exceptions peuvent survenir lors de l'utilisation réelle :

new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
return o1.getId() > o2.getId() ? 1 : -1;
}
}

9 [Recommandation] Lors de l'initialisation d'une collection, essayez de spécifier la taille de la valeur initiale de la collection.

Remarque : Essayez d'utiliser ArrayList(int initialCapacity) pour initialiser ArrayList.


10. [Recommandé] Utilisez EntrySet pour parcourir la collection de classes Map KV au lieu de keySet.

Explication : keySet est en fait parcouru deux fois, l'une consiste à le convertir en un objet Iterator et l'autre consiste à retirer la valeur correspondant à key du hashMap. Le EntrySet ne traverse qu'une seule fois et place à la fois la clé et la valeur dans l'entrée, ce qui est plus efficace. Dans le cas du JDK 8, utilisez la méthode Map foreach.

Exemple positif : values() renvoie un ensemble de valeurs V, qui est un objet de collection de liste ; keySet() renvoie un ensemble de valeurs K, qui est un objet de collection Set ; EntrySet() renvoie une combinaison de valeurs K - V.


11. [Recommandation] Faites très attention à savoir si la collection de classes Map K/V peut stocker des valeurs nulles, comme indiqué dans le tableau suivant :

QQ截图20170211092116.png

Contre-exemple : En raison de l'interférence de HashMap, beaucoup de gens pensent que ConcurrentHashMap peut placer une valeur nulle. Notez qu'une exception NPE sera levée lors du stockage de la valeur null.


12. [Référence] Faire bon usage de l'ordre (tri) et de la stabilité (ordre) de l'ensemble pour éviter les conséquences négatives du désordre (désordre) et de la

instabilité (désordre) de l'ensemble Influence.

Explication : La stabilité signifie que l'ordre des éléments dans la collection est certain à chaque fois qu'elle est parcourue. L'ordre signifie que les résultats du parcours sont classés dans l'ordre selon certaines règles de comparaison. Par exemple : ArrayList est un ordre/un tri ; HashMap est un ordre/un tri ; TreeSet est un ordre/un tri.


13. [Référence] Grâce aux caractéristiques uniques de l'élément Set, vous pouvez rapidement dédupliquer un ensemble et éviter d'utiliser la méthode

contains de List pour les opérations de parcours, de comparaison et de déduplication.