亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

Table des matières
Comment HashMap fonctionne à l'international
Facteurs de performance clés
2. Qualité de la fonction de hachage
3. Résolution de collision: liste liée par rapport à l'arbre
4. redimensionner les frais généraux
Performance dans la pratique: complexité temporelle
Concurrence et alternatives
Au-dessus de la mémoire
Quand utiliser hashmap: meilleures pratiques
Résumé
Maison Java javaDidacticiel Une plongée profonde dans Java Hashmap et sa performance

Une plongée profonde dans Java Hashmap et sa performance

Aug 01, 2025 am 05:54 AM

Hashmap est implémenté en Java via des listes liées à l'arraie / des arbres rouges et noirs. Ses performances sont affectées par la capacité initiale, le facteur de charge, la qualité de la fonction de hachage et l'immuabilité des clés; 1. Utiliser (N-1) et hachage pour calculer l'indice pour améliorer l'efficacité; 2. Lorsque la longueur de liste liée dépasse 8 et le nombre de seaux ≥64, il sera converti en un arbre rouge et noir, réduisant la pire complexité de recherche de O (n) à O (log n); 3. Rehaster tous les éléments lors de l'expansion, les frais généraux sont élevés et la capacité doit être prédéfinie; 4. La clé doit être réécrit HashCode et égale correctement; 5. Concurrenthashmap doit être utilisé dans des scénarios multithreads; La complexité du temps moyenne est O (1) dans une utilisation raisonnable, mais une mauvaise utilisation entra?nera une dégradation des performances.

Une plongée profonde dans Java Hashmap et sa performance

HashMap de Java est l'une des structures de données les plus utilisées dans le cadre des collections Java. Il fournit un moyen rapide et efficace de stocker et de récupérer les paires de valeurs clés à l'aide de hachage. Mais comment ?a marche vraiment sous le capot? Et qu'est-ce qui affecte ses performances dans les applications du monde réel? Prenons une plongée profonde dans HashMap , de sa structure interne aux implications de performance.

Une plongée profonde dans Java Hashmap et sa performance

Comment HashMap fonctionne à l'international

à la base, HashMap utilise un tableau de seaux, où chaque seau peut contenir une liste liée ou un arbre (dans certains cas) des entrées. Voici une ventilation des composants clés:

  • Tableau de seaux : le HashMap maintient un tableau interne ( Node<k>[] table</k> ) où chaque index est appelé "godet".
  • Fonction de hachage : Lorsque vous insérez une paire de valeurs de clé, le hashCode() de la clé est utilisé pour calculer un index dans le tableau.
  • Calcul de l'index : L'indice de godet réel est calculé en utilisant (n - 1) & hash , où n est la longueur du tableau (qui est toujours une puissance de deux). C'est plus rapide que d'utiliser le module.
  • Gestion des collisions : Si deux clés hachent le même seau, les entrées sont stockées dans une liste liée. à partir de Java 8, si un seau pousse au-delà d'un seuil (par défaut 8) et que le tableau est suffisamment grand, la liste liée est convertie en un arbre équilibré (une structure TreeNode ) pour améliorer les performances du pire des cas de O (n) à O (log n).

Chaque entrée de la carte est une instance d'une classe Node interne, qui contient:

Une plongée profonde dans Java Hashmap et sa performance
  • Le hachage de la clé
  • La clé
  • La valeur
  • Une référence au n?ud suivant (pour gérer les collisions)

Facteurs de performance clés

Plusieurs facteurs influencent les performances d'un HashMap . Les comprendre aide à éviter les pièges courants.

1. Capacité initiale et facteur de charge

  • Capacité initiale : le nombre de seaux dans la table de hachage lorsqu'il est créé. La valeur par défaut est 16.
  • Facteur de chargement : une mesure de la fa?on dont la table de hachage est autorisée à obtenir avant le redimensionnement. La valeur par défaut est de 0,75.

Lorsque le nombre d'entrées dépasse capacity × load factor , le redimensionnement HashMap (généralement en double), ce qui implique de remanier toutes les entrées existantes - une opération O (n).

Une plongée profonde dans Java Hashmap et sa performance

? Best Practice : Si vous connaissez le nombre attendu d'entrées, initialisez le HashMap avec une capacité appropriée pour minimiser la remaniement.

 // Si vous vous attendez à ~ 1000 entrées
Map <string, entier> map = new hashmap <> (1024, 0,75f);

Cela évite plusieurs opérations de redimensionnement.

2. Qualité de la fonction de hachage

Une mauvaise implémentation hashCode() peut conduire à de nombreuses collisions, transformant le HashMap en une collection de listes (ou arbres) liées depuis longtemps, des performances dégradantes.

? Assurez-vous que les clés remplacent hashCode() et equals() correctement et uniformément les valeurs de hachage distribuées.

Par exemple, l'utilisation d'une clé qui renvoie toujours le même code de hachage (par exemple, return 0; ) transforme HashMap en une liste liée - chaque opération devient O (n).

3. Résolution de collision: liste liée par rapport à l'arbre

Dans Java 8, lorsqu'un seau a plus de 8 n?uds et que la taille du tableau est d'au moins 64, la liste est convertie en un arbre rouge-noir.

  • Meilleur cas : o (1) pour obtenir / mettre
  • Pire des cas (de nombreuses collisions) : o (log n) après arborescence, au lieu de o (n)

Cette optimisation est cruelle pour la défense contre les attaques de déni de service via des collisions de hachage (par exemple, dans les serveurs Web utilisant la saisie de l'utilisateur comme clés).

4. redimensionner les frais généraux

Le redimensionnement co?te cher car cela nécessite:

  • Créer un nouveau tableau plus grand
  • Re-compliquer les positions de hachage pour toutes les entrées
  • Réinsertion de toutes les entrées

Le redimensionnement fréquent peut ralentir considérablement les insertions en vrac.

?? évitez de laisser la carte se développer dynamiquement avec de grands ensembles de données. Pré-dimension lorsque cela est possible.


Performance dans la pratique: complexité temporelle

Opération Cas moyen Pire
put(K, V) O (1) O (log n)
get(K) O (1) O (log n)
remove(K) O (1) O (log n)
Itération sur les entrées Sur) Sur)

Remarque: Le pire des cas suppose que les seaux arboressés. Sans arborescence, le pire des cas serait O (n) par opération.


Concurrence et alternatives

HashMap n'est pas en file d'attente . Dans des environnements multithreads, il peut entra?ner des boucles infinies (en particulier lors de la redimensionnement dans les versions Java plus anciennes) ou une corruption de données.

  • Utilisez ConcurrentHashMap pour les opérations de filetage.
  • ConcurrentHashMap utilise également des optimisations similaires (arbreifiez, redimensionnement) mais avec des opérations de verrouillage ou de CAS à grains fins.
 Map <string, entier> safemap = new concurrenthashmap <> ();

Il évolue mieux sous une concurrence élevée et évite les pièges des Collections.synchronizedMap() .


Au-dessus de la mémoire

Chaque Node dans HashMap a une surcharge d'objet:

  • Référence à la clé, valeur, suivant
  • Code de hachage stocké
  • En-tête d'objet (12–16 octets selon JVM)

Pour les grandes cartes, cela peut s'additionner. Considérez des alternatives comme:

  • IdentityHashMap (si l'égalité de référence suffit)
  • Des bibliothèques tierces comme Trove ( TObjectObjectHashMap ) pour une réduction des frais généraux
  • Stockage hors têtes pour de très grands ensembles de données

Quand utiliser hashmap: meilleures pratiques

  • ? Utiliser lorsque vous avez besoin de recherche, d'insertion et de suppression rapide aux cas moyens.
  • ? Assurez-vous que les clés sont immuables ou ne changent pas d'une manière qui affecte hashCode() ou equals() .
  • ? remplacer hashCode() et equals() correctement dans les classes de clés personnalisées.
  • ? Pré-dimensionner la carte pour les volumes de données connus.
  • ? évitez d'utiliser des objets mutables comme clés.
  • ? Ne stockez pas de données sensibles dans HashMap sans nettoyer les références - des fuites de mémoire peuvent se produire.

Exemple d'une bonne clé:

 classe finale publique PersonKKey {
    String final privé FirstName;
    String final privé LastName;

    // Constructeur, égaux, HashCode ...

    @Outrepasser
    public int hashcode () {
        return objets.hash (FirstName, LastName);
    }
}

Résumé

HashMap est une structure de données puissante et efficace lorsqu'elle est utilisée correctement. Ses performances O (1) moyennes proviennent du hachage intelligent, du redimensionnement dynamique et de la gestion des collisions via des listes et des arbres liés. Cependant, les performances peuvent se dégrader en raison de mauvaises fonctions de hachage, de tailles incorrectes ou d'utilisation abusive des clés.

En comprenant comment cela fonctionne - de l'indexation du seau à l'arborescence - et en appliquant les meilleures pratiques autour de la capacité, du hachage et de la concurrence, vous pouvez tirer le meilleur parti du HashMap dans les applications critiques de performance.

Fondamentalement, c'est rapide, mais vous devez respecter le hachage.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Quel est le type ?enum? en Java? Quel est le type ?enum? en Java? Jul 02, 2025 am 01:31 AM

Les énumérations en Java sont des classes spéciales qui représentent le nombre fixe de valeurs constantes. 1. Utilisez la définition du mot-clé énuméré; 2. Chaque valeur d'énumération est une instance finale statique publique du type d'énumération; 3. Il peut inclure des champs, des constructeurs et des méthodes pour ajouter un comportement à chaque constante; 4. Il peut être utilisé dans les instructions de commutation, prend en charge la comparaison directe et fournit des méthodes intégrées telles que Name (), Ordinal (), Values ??() et ValueOf (); 5. L'énumération peut améliorer la sécurité, la lisibilité et la flexibilité du type, et convient aux scénarios de collecte limités tels que les codes d'état, les couleurs ou la semaine.

Quel est le principe de ségrégation de l'interface? Quel est le principe de ségrégation de l'interface? Jul 02, 2025 am 01:24 AM

Le principe d'isolement de l'interface (ISP) exige que les clients ne comptent pas sur des interfaces inutilisées. Le noyau est de remplacer les interfaces grandes et complètes par plusieurs interfaces petites et raffinées. Les violations de ce principe comprennent: une exception non implémentée a été lancée lorsque la classe met en ?uvre une interface, un grand nombre de méthodes non valides sont implémentées et des fonctions non pertinentes sont classées de force dans la même interface. Les méthodes d'application incluent: Diviser les interfaces en fonction des méthodes communes, en utilisant des interfaces divisées en fonction des clients et en utilisant des combinaisons au lieu d'implémentations multi-interfaces si nécessaire. Par exemple, divisez les interfaces machine contenant des méthodes d'impression, de balayage et de fax en imprimante, scanner et faxmachine. Les règles peuvent être assouplies de manière appropriée lors de l'utilisation de toutes les méthodes sur de petits projets ou tous les clients.

Techniques de programmation asynchrones dans Java moderne Techniques de programmation asynchrones dans Java moderne Jul 07, 2025 am 02:24 AM

Java prend en charge la programmation asynchrone, y compris l'utilisation de la transition complète, des flux réactifs (tels que ProjectActor) et des threads virtuels dans Java19. 1.COMPLETABLEFUTURE Améliore la lisibilité et la maintenance du code à travers les appels de cha?ne et prend en charge l'orchestration des taches et la gestion des exceptions; 2. ProjectAacteur fournit des types de mono et de flux pour implémenter une programmation réactive, avec mécanisme de contre-pression et des opérateurs riches; 3. Les fils virtuels réduisent les co?ts de concurrence, conviennent aux taches à forte intensité d'E / S et sont plus légères et plus faciles à développer que les fils de plate-forme traditionnels. Chaque méthode a des scénarios applicables, et les outils appropriés doivent être sélectionnés en fonction de vos besoins et les modèles mixtes doivent être évités pour maintenir la simplicité

Différences entre callable et coulable en java Différences entre callable et coulable en java Jul 04, 2025 am 02:50 AM

Il existe trois principales différences entre lesquelles appelant et coulable en Java. Tout d'abord, la méthode callable peut renvoyer le résultat, adapté aux taches qui doivent retourner des valeurs, telles que callable; Alors que la méthode Run () de Runnable n'a pas de valeur de retour, adaptée aux taches qui n'ont pas besoin de retourner, comme la journalisation. Deuxièmement, Callable permet de lancer des exceptions vérifiées pour faciliter la transmission d'erreur; tandis que Runnable doit gérer les exceptions en interne. Troisièmement, Runnable peut être directement transmis sur le thread ou l'exécutor-service, tandis que Callable ne peut être soumis qu'à ExecutorService et renvoie le futur objet à

Meilleures pratiques pour utiliser des énumérations en java Meilleures pratiques pour utiliser des énumérations en java Jul 07, 2025 am 02:35 AM

En Java, les énumérations conviennent à représenter des ensembles constants fixes. Les meilleures pratiques incluent: 1. Utilisez ENUM pour représenter l'état fixe ou les options pour améliorer la sécurité et la lisibilité des types; 2. Ajouter des propriétés et des méthodes aux énumérations pour améliorer la flexibilité, telles que la définition des champs, des constructeurs, des méthodes d'assistance, etc.; 3. Utilisez Enuummap et Enumset pour améliorer les performances et la sécurité des types car ils sont plus efficaces en fonction des tableaux; 4. évitez l'abus des énumérations, tels que des valeurs dynamiques, des changements fréquents ou des scénarios logiques complexes, qui doivent être remplacés par d'autres méthodes. L'utilisation correcte de l'énumération peut améliorer la qualité du code et réduire les erreurs, mais vous devez faire attention à ses limites applicables.

Comprendre Java Nio et ses avantages Comprendre Java Nio et ses avantages Jul 08, 2025 am 02:55 AM

Javanio est un nouvel IOAPI introduit par Java 1.4. 1) s'adresse aux tampons et aux canaux, 2) contient des composants de tampon, de canal et de sélecteur, 3) prend en charge le mode non bloquant et 4) gère les connexions simultanées plus efficacement que l'OI traditionnel. Ses avantages se reflètent dans: 1) IO non bloquant les réductions de la surcharge du thread, 2) le tampon améliore l'efficacité de transmission des données, 3) le sélecteur réalise le multiplexage et 4) la cartographie de la mémoire accélère la lecture et l'écriture de la lecture de fichiers. Remarque Lorsque vous utilisez: 1) le fonctionnement FLIP / clair du tampon est facile à confondre, 2) les données incomplètes doivent être traitées manuellement sans blocage, 3) l'enregistrement du sélecteur doit être annulé à temps, 4) Nio ne convient pas à tous les scénarios.

Explorer différents mécanismes de synchronisation en Java Explorer différents mécanismes de synchronisation en Java Jul 04, 2025 am 02:53 AM

JavaprovidesMultiplesynchronisationToolsforthReadsafety.1.SynchroniséBlockSenSureMutualExclusionByLockingMethodSorseCificcodesesections.2.ReentrantLockoffersAdvancedControl, y compris les éperons

Comment les chargeurs de classe Java fonctionnent en interne Comment les chargeurs de classe Java fonctionnent en interne Jul 06, 2025 am 02:53 AM

Le mécanisme de chargement des classes de Java est implémenté via Classloader, et son flux de travail principal est divisé en trois étapes: chargement, liaison et initialisation. Pendant la phase de chargement, Classloader lit dynamiquement le bytecode de la classe et crée des objets de classe; Les liens incluent la vérification de l'exactitude de la classe, l'allocation de la mémoire aux variables statiques et les références de symbole d'analyse; L'initialisation effectue des blocs de code statique et des affectations de variables statiques. Le chargement des classes adopte le modèle de délégation parent et hiérarchise le chargeur de classe parent pour trouver des classes et essayez Bootstrap, Extension et ApplicationClassloader pour s'assurer que la bibliothèque de classe de base est s?re et évite le chargement en double. Les développeurs peuvent personnaliser le chargeur de classe, comme UrlClassl

See all articles