2. JAVA [Collection]

Répertoire d'articles

Les avantages du cadre de collecte?

  1. Utilisez les classes de collection de base pour réduire les coûts de développement
  2. Réutilisabilité et opérabilité

Quels sont les avantages des génériques dans le cadre de collecte?

  1. Les génériques nous permettent de fournir une collection de types d'objets pouvant être adaptés. Par conséquent, si vous ajoutez des éléments d'autres types, des erreurs de compilation se produiront. Cela évite ClassCastException au moment de l'exécution.
  2. Les génériques rendent le code propre, sans qu'il soit nécessaire d'utiliser des opérateurs de conversion explicite et instanceOf. Il apporte également des avantages au runtime, car aucune instruction de bytecode pour la détection de classe n'est générée.

Quelles sont les interfaces de base du framework de collecte JAVA?

La collection est l'interface racine de la hiérarchie des collections. Une collection représente un groupe d'objets, et ces objets sont ses éléments:

  1. Ensemble: est un ensemble qui ne peut pas contenir d'éléments répétés
  2. List: est une collection ordonnée qui peut contenir des éléments répétés. Vous pouvez utiliser des index pour accéder aux éléments. Vous pouvez le considérer comme un tableau dont la longueur est développée dynamiquement

Map est un objet qui mappe la clé à la valeur. Une carte ne peut pas contenir de clés en double et chaque clé peut mapper au plus une valeur

Il existe d'autres interfaces, telles que: Queue, Dequeue, SortedSet, SortedMap et Listlterator

Pourquoi l'interface Map n'hérite-t-elle pas de l'interface Collection?

  1. La carte n'est pas une collection
  2. Si Map hérite de Collection, Map contient des paires clé-valeur, ce qui ne convient pas à un ensemble de spécifications d'objet

La différence entre collection et collections?

  1. Collection, est l'interface supérieure de la classe de collection, les principales interfaces héritant de lui sont Set et List
  2. Collections est une classe d'outils pour les collections. Elle fournit une série de méthodes statiques pour implémenter des opérations telles que la recherche, le tri et la sécurité des threads sur diverses collections.

Quels sont les algorithmes généraux de la collection?

  1. Trier et rechercher
  2. La classe Collections contient l'implémentation de ces méthodes. La plupart des algorithmes fonctionnent sur List, mais certains sont disponibles pour tous les types de collections. Certains algorithmes incluent le tri, la recherche, le mélange, le maximum et le minimum

Interface de données telle que le cadre de collecte

Liste:

  1. ArrayList: tableau d'objets
  2. Vecteur: tableau d'objets
  3. LinkedList: liste double chaînée (liste chaînée circulaire avant jdk6, jdk7 annule le cycle)

Carte:

  1. HashMap: Avant JDK8, il est composé de tableau + liste liée. Array est le thème de HashMap. La liste liée est principalement utilisée pour résoudre le problème de collision de hachage.
    Après JDK8, il y a un changement dans la résolution du conflit de hachage. Lorsque le la longueur de la liste liée est supérieure au seuil (par défaut Quand il est de 8), convertissez la liste liée en un arbre rouge-noir pour réduire le temps de recherche
  2. LinkedHashMap: LinkedHashMap hérite de HashMap, et toutes les couches inférieures sont toujours basées sur la structure de hachage de fermeture à glissière, qui est composée de tableaux et de listes liées ou d'arbres rouge-noir. De plus, LinkedHashMap ajoute une liste doublement liée basée sur la structure ci-dessus, de sorte que l'interface ci-dessus puisse maintenir l'ordre d'insertion des paires clé-valeur. En même temps, grâce aux opérations correspondantes sur la liste chaînée, la logique liée à la séquence d'accès est réalisée
  3. HashTable: composé de tableau + liste liée, le tableau est le corps principal du HashMap, la liste liée sert à résoudre le conflit de Hash
  4. TreeMap: arbre rouge-noir (arbre binaire de tri auto-équilibré)

Ensemble:

  1. HashSet: non ordonné, unique, basé sur HashMap, la couche inférieure utilise HashMap pour stocker des éléments
  2. LinkedHashSet: hérite de HashSet, et son interne est réalisé via LinkedHashMap
  3. TreeSet: arbre ordonné, unique, rouge-noir

Qu'est-ce qu'un itérateur?

L'interface Iterator fournit de nombreuses méthodes pour itérer sur des éléments de collection. Chaque classe de collection contient des méthodes d'itération qui peuvent renvoyer des instances d'itération. L'itérateur peut supprimer l'élément sous-jacent pendant l'itération, mais il ne peut pas appeler directement la méthode remove de la classe de collection pour le supprimer, et vous pouvez appeler la méthode remove de l'itérateur pour supprimer

Quelle est la différence entre Iterator et ListIterator?

  1. Iterator peut être utilisé pour parcourir les collections Set et List, mais ListIterator ne peut être utilisé que pour parcourir List
  2. Iterator ne peut parcourir la collection que vers l'avant et ListIterator peut être vers l'avant ou vers l'arrière
  3. ListIterator hérite de l'interface Iterator et contient d'autres fonctions. Par exemple: ajouter des éléments, remplacer des éléments, obtenir l'index de l'élément précédent et de l'élément suivant, etc.

Quelle est la différence entre fail-fast et fail-safe?

Différent de l'exception ConcurrentModification:

  1. Échec rapide: lorsque vous itérez une collection, si un autre thread modifie la collection à laquelle vous accédez, une exception ConcurrentModification sera levée. Tout sous le package java.util échoue rapidement
  2. Échec de sécurité: lorsque vous revenez à la collection inférieure pour effectuer une copie pendant l'itération, toutes les modifications apportées à la collection supérieure ne seront pas affectées et l'exception ConcurrentModification ne sera pas levée. Tous sous le package java.util.concurrent sont sûrs d'échouer

Comment supprimer un élément dans la liste?

  1. Utilisez Iterator, l'ordre est vers le bas, si l'élément est trouvé, utilisez la méthode remove pour supprimer
  2. Parcourez la liste dans l'ordre inverse, si un élément est trouvé, utilisez la méthode remove pour supprimer

Quelle est la différence entre les interfaces Enumeration et Iterator?

  1. En revanche, l'énumération est 2 fois plus rapide et prend moins de mémoire
  2. Les itérateurs sont plus sûrs car les autres threads ne peuvent pas modifier les objets de collection traversés par l'itérateur actuel. Dans le même temps, les itérateurs permettent à l'appelant de supprimer des éléments de la collection sous-jacente, l'énumération ne peut pas être terminée

Implémentation concrète de l'interface Iterator

  1. échec rapide 代表 : ArrayList
  2. sécurité intégrée 代表 : CopyOnWriteArrayList

La différence entre Comparable et Comparator?

  1. L'interface Comparable, sous le package java.lang, est utilisée pour comparer l'objet actuel avec d'autres objets, elle dispose donc d'une méthode CompareTo pour le tri. Paramètre 1
  2. L'interface Comparator, sous le package java.util, est utilisée pour transmettre deux objets à des fins de comparaison, il existe donc une méthode de comparaison pour le tri. 2 paramètres

La différence entre List et Set?

List et Sert héritent de l'interface Collection

  1. Caractéristiques de la liste: les éléments sont placés dans l'ordre, peuvent être répétés, n'li prend en charge les boucles, et les itérateurs peuvent également être utilisés pour parcourir les indices
  2. Les fonctions d'ensemble, les éléments sont placés en désordre et ne peuvent pas être répétés, et les éléments répétés seront écrasés. Bien que placés en désordre, la position de l'élément dans l'ensemble est fixe, ce qui est déterminé par le hashcode de l'élément. Il ne peut être parcouru que par itération

Comparaison des listes et des ensembles:

  1. Définir: l'efficacité de la récupération de l'élément spécifié est élevée, et l'efficacité de la suppression et de l'insertion est élevée. L'insertion et la suppression peuvent entraîner une modification de la position de l'élément
  2. Liste: similaire à un tableau, la liste peut croître dynamiquement, l'efficacité de la recherche de l'élément spécifié est faible et l'efficacité de l'insertion et de la suppression de l'élément spécifié est faible, car cela peut entraîner le changement de positions d'autres éléments

S'il s'agit d'un accès aléatoire, la liste sera plus rapide que définie

Quelle est la différence entre Array et ArrayList? Quand est-il approprié d'utiliser Array?

  1. Array peut contenir des types et des objets de base, tandis que ArrayList ne peut contenir que des objets
  2. Array a une taille spécifiée, tandis que la taille de ArrayList est fixe et peut être automatiquement étendue
  3. Array n'est pas aussi polyvalent que Arraylist, tel que addAll, removeAll et iterator, etc.

Quand Array est-il plus approprié

  1. Si la taille de la liste est fixe, la plupart des cas sont le stockage et la traversée
  2. Pour parcourir les types de données de collection, bien que Collections utilise l'auto-boxing pour faciliter la tâche de codage, travailler sur des listes de types de base de tailles spécifiées deviendra également très lent
  3. Comment voulez-vous utiliser un tableau multidimensionnel, utiliser [] [] est plus pratique que list

Quelle est la différence entre ArrayList et LinkedList?

ArrayList:
avantage: tableau dynamique, en raison de la continuité de l'adresse, l'efficacité de l'opération de requête sera plus élevée si elle est stockée.
Inconvénient: comme l'adresse est continue, ArrayList doit déplacer des données, donc l'efficacité des opérations d'insertion et de suppression est relativement faible

LinkedList:
Avantages: Sur la base de la structure de données de la liste liée, l'adresse est arbitraire, il n'est donc pas nécessaire d'attendre une adresse continue lors de l'ouverture de l'espace mémoire. Pour les opérations d'ajout et de suppression, il est plus dominant. Il convient aux scènes
qui nécessitent des opérations de tête et de queue ou qui insèrent une position spécifiée. Inconvénient: étant donné que le pointeur doit être déplacé, les performances de l'opération de requête sont relativement faibles

Quelle est la différence entre ArrayList et Vector?

Les deux sont implémentés par des tableaux, et il existe trois différences principales:

  1. Vector a synchronisé le mot-clé dans de nombreuses méthodes, ce qui est sûr pour plusieurs threads, alors que ArrayList ne l'est pas
  2. Les deux utilisent un espace continu linéaire pour stocker les éléments, mais lorsque l'espace est insuffisant, les méthodes de croissance des deux classes sont différentes
  3. Le vecteur peut définir le facteur de croissance, mais ArrayList ne peut pas

Analyse de scénarios d'application:

  1. Indépendamment de la sécurité des threads, l'utilisation d'ArrayList est plus efficace, mais en fait CopyOnWriteArrayList est souvent utilisé si la sécurité des threads est
  2. Si le nombre d'éléments de la collection est supérieur à la longueur du tableau de collection, l'utilisation d'une quantité relativement importante de données dans la collection, l'utilisation de Vector présente certains avantages. Dans ce cas, il est plus approprié d'utiliser linkedList

La différence entre HashMap et HashTable?

  1. Héritage différent: HashTable hérite du dictionnaire, HashMap hérite de l'interface de la carte
  2. HashMap autorise les valeurs nulles, HashTable ne permet pas
  3. Sécurité des fils HashTable, sécurité des fils HashMap
  4. L'itération de HashMap échoue rapidement, alors que HashTable n'est pas
  5. L'expansion n'est pas la même chose. L'expansion de HashMap est une taille exponentielle de 2 à chaque fois, alors que HashTable est ancien * 2 + 1

En règle générale, il n'est pas recommandé d'utiliser HashTable maintenant, et ConcurrentHashMap peut être utilisé à la place dans un environnement multi-thread

La différence entre HashSet et HashMap?

  1. L'ensemble est une structure linéaire et la valeur ne peut pas être répétée. HashSet est l'implémentation de hachage de Set. La valeur dans Hashset ne peut pas être répétée est réalisée par la clé de HashMap
  2. Map est un mappage de paires clé-valeur, qui peut être vide. HashMap est l'implémentation de hachage de Map. L'unicité de la clé est déterminée par l'unicité du hashcode de la clé et la valeur de la valeur est une structure de liste liée, car elle est différente des valeurs de clé peuvent exister Le même hashcode, donc la valeur de la valeur doit être une structure de liste liée

Ce qu'ils ont en commun, c'est le caractère unique de l'algorithme de hachage. Ils ne peuvent pas contenir de types de base, uniquement des objets

La différence entre HashSet et TreeSet?

La différence entre b?

  1. HashSet est implémenté avec une table de hachage, donc ses éléments ne sont pas ordonnés. La complexité temporelle de l'ajout et de la suppression est O (1)
  2. TreeSet est implémenté avec une structure arborescente, donc il est ordonné. L'heure de l'ajout et de la suppression de fu'za'du
    est O (logn)

Correspondant aux opérations d'insertion et de suppression dans la carte, HashMap est le meilleur choix.
Si vous devez parcourir une clé ordonnée, TreeSet est le meilleur choix.
En fonction de la taille de votre collection, il peut être plus rapide d'ajouter des éléments à la HashMap, puis Remplacez HashMap par TreeMap pour une traversée ordonnée des clés

La différence entre HashMap et ConcurrentHashMap?

ConcurrentHashMap est une implémentation HashMap thread-safe. Les principales différences sont les suivantes:

  1. ConcurrentHashMap sépare l'ensemble du tableau de compartiments en segments, puis utilise des verrous pour protéger chaque segment. Par rapport au verrou de mot-clé syn de HashTable, la granularité est plus fine et les performances de concurrence sont meilleures. HashMap n'a pas de mécanisme de verrouillage et n'est pas thread-safe

Après JDK8, ConcurrentHashMap a activé une nouvelle façon de réaliser, en utilisant l'algorithme CAS
2. Les paires clé-valeur HashMap autorisent null, ConcurrentHashMap ne permet pas

Que sont les files d'attente et les piles, et répertoriez leurs différences?

Les deux sont utilisés pour stocker des données
1.java.util.queue est une interface et sa classe d'implémentation se trouve dans le package concurrent java.
La file d'attente permet au premier entré premier sorti (FIFO) de récupérer des éléments. L'
interface Deque permet de récupérer des éléments des deux côtés
. 2. La pile est similaire à une file d'attente, mais elle permet le dernier entré premier sorti (LIFO ) récupération d'éléments.
Stack est une classe qui s'étend de Vecctor, tandis que Queue est une interface

Comment fonctionne HashMap?

Les deux structures les plus couramment utilisées en Java sont les tableaux et les pointeurs analogiques (références). HashMap l'est aussi, donc HashMap est un hachage de liste chaînée, HashMap est basé sur le principe du hasing:

  1. Rechercher un élément dans le tableau par hashcode
  2. Utilisez la méthode égale de la clé pour parcourir la liste chaînée afin de trouver la valeur correspondant à la clé

Que se passe-t-il lorsque le hashcode de deux objets est le même?

  1. Lorsque le hashcode est le même, leurs positions de compartiment sont donc les mêmes et une collision de hachage se produit
  2. Étant donné que hashMap utilise une liste liée pour stocker des objets, cette entrée (objet Map.Entry contenant des paires clé-valeur) sera stockée dans la liste liée

Quelle est l'importance des méthodes HashCode et equals?

HashMap utilise les méthodes hashcode et equals de l'objet clé pour déterminer l'index clé-valeur. Lorsque nous essayons d'obtenir des valeurs de HashMap, ces méthodes seront utilisées

  1. Si ces deux méthodes ne sont pas utilisées correctement, deux clés différentes peuvent produire le même hashcode et une sortie égale. HashMap les considérera comme identiques et les écrasera au lieu de les stocker à des endroits différents.
  2. De même, si les classes de collection qui stockent des données en double ne sont pas autorisées à utiliser le hashcode et equals pour trouver les doublons, il est très important de les utiliser correctement. L'implémentation doit suivre les règles suivantes:

Si o1.equals (o2), alors o1.hashcode () == o2.hashcode (), c'est toujours vrai.
Si o1.hashcode () == o2.hashcode (), je ne pense pas que o1.equals ( o2) Will est vrai

Quelle est la capacité par défaut de HashMap?

La valeur par défaut est 16 et le facteur de charge est de 0,75. Autrement dit, HashMap est rempli à 75% du busket

Quel est l'ordre des classes d'implémentation HashMap?

  1. LinkedHashMap est basé sur l'ordre dans lequel les éléments entrent dans la collection ou l'ordre dans lequel ils sont accédés
  2. TreeMap est basé sur l'ordre inhérent des éléments.

N'importe quelle classe peut-elle être utilisée comme clé de Map?

Oui, mais vous devez tenir compte des points suivants:

  1. Si la classe remplace la méthode equals, elle doit également remplacer la méthode hashCode
  2. Il est préférable d'utiliser une classe immuable comme clé. De cette façon, le hashcode peut être mis en cache et avoir de meilleures performances. Cela peut également garantir que le futur hashcode et equals ne changeront pas. Par conséquent, String et Integer sont utilisés comme clés hashMap .

Pourquoi la longueur de HashMap est-elle une puissance de 2?

Afin de rendre l'accès à HashMap efficace, il y a aussi peu de collisions que possible, c'est-à-dire que les données sont réparties aussi uniformément que possible, et la longueur de chaque liste chaînée / arbre rouge-noir est à peu près la même.
Comment cet algorithme doit-il être conçu?
Opération du reste:
1. Reste (%) Si le diviseur est une puissance de 2, cela équivaut à l'opération AND (&) consistant à soustraire un du diviseur, c'est-à-dire (hachage% length est leng't == hash & (longueur -1)) La prémisse est que la longueur est de 2 à la nième puissance
. 2. L'utilisation de l'opération binaire &, par rapport à% peut améliorer l'efficacité du calcul.
Par conséquent, la longueur de HashMap est la puissance de 2

Comment fonctionne HashSet?

HashSet, lorsque nous créons un objet HashSet, un objet de carte sera également créé à l'intérieur. Toutes les opérations HashSet ultérieures sont en fait basées sur l'encapsulation sur cette carte

Comment HashSet vérifie-t-il les doublons?

Lorsque vous ajoutez un objet à un HashSet, HashSet calculera d'abord la valeur de hashcode de l'objet pour déterminer où l'objet est ajouté, et les collègues prendront également des notes avec les valeurs de hashcode d'autres objets ajoutés

  1. S'il n'y a pas de hashcode identique, hashset supposera que l'objet n'apparaît pas à plusieurs reprises
  2. Si un objet avec la même valeur de hashcode est trouvé, la méthode equals sera appelée pour vérifier si l'objet avec le même hashcode est vraiment le même. Si les deux sont identiques, le hashset ne permettra pas à l'opération de jointure de réussir; si les deux sont différents, le hashset laissera l'opération de jointure réussie

Qu'est-ce que Java Priority Queue?

Il s'agit d'une file d'attente illimitée de tas prioritaire, et ses éléments sont classés dans leur ordre naturel

  1. Lors de sa création, nous pouvons fournir un comparateur Comparator pour être responsable du tri des éléments dans PriorityQueue
  2. Les éléments nuls ne sont pas autorisés, les objets qui ne fournissent pas un ordre naturel et les objets sans comparateur associé ne sont pas autorisés
  3. Il n'est pas thread-safe, il nécessite une complexité de temps o (log (n)) dans l'exécution des opérations de mise en file d'attente et de retrait de la file d'attente

La différence entre les méthodes de sondage et de suppression?

  1. poll, il retournera vide lorsque l'élément ne parvient pas à obtenir
  2. remove, une exception sera levée en cas d'échec

Quelle est la différence entre LinkedHashMap et PriorityQueue?

  1. priorityqueue garantit que l'élément de priorité la plus élevée ou la plus basse est toujours en tête de la file d'attente, et l'ordre maintenu par linkedhashmap est l'ordre d'insertion de l'élément
  2. Lors de la traversée d'une file d'attente prioritaire, il n'y a pas de garantie d'ordre, mais linkedhashmao garantit que l'ordre de traversée est l'ordre d'insertion des éléments

Je suppose que tu aimes

Origine blog.csdn.net/qq_37629227/article/details/112777811
conseillé
Classement