Il y aura de nombreux objets dans le développement réel du projet. Java fournit un cadre de collecte pour résoudre ces problèmes. Les classes sont dans le package java.util et la liste 1 décrit la relation entre la classe de collection.
Listing 1. La relation entre la classe de collection
Collection
├List
Lish linked
│laArrayList
Oorvecteur
│ Kstack
└set
Carte
Bhashtable
Phashmap
Coup de poing
Interface de collecte
Interface de collecte
La collection est l'interface de collection la plus élémentaire. Certaines collections permettent les mêmes éléments et soutiennent les éléments de tri, tandis que d'autres ne fonctionnent pas. JDK ne fournit pas de classes directement héritées de la collection. Toutes les classes qui implémentent l'interface de collecte doivent fournir deux constructeurs standard. Ce dernier constructeur permet aux utilisateurs de copier une collection.
Comment itérer à travers chaque élément de la collection?
Quel que soit le type réel de collection, il prend en charge une méthode Iterator (). L'utilisation typique est la suivante:
Iterator it = collection.iterator ();
Les deux interfaces de l'interface de collection sont la liste et la définition.
La méthode principale fournie par l'interface de collecte:
1. Boolean Add (objet o) Ajouter un objet à la collection;
2. Boolean Supprimer (objet o) Supprimer l'objet spécifié;
3. Int size () renvoie le nombre d'éléments dans la collection actuelle;
4. Boolean contient (objet o) Recherchez s'il existe des objets spécifiés dans l'ensemble;
5. Boolean iSempty () Déterminez si l'ensemble est vide;
6. Iterator Iterator () Renvoie un itérateur;
7. Boolean Contintainall (Collection C) Trouvez s'il y a des éléments dans l'ensemble C dans l'ensemble;
8. Boolean Addall (Collection C) ajoute tous les éléments de la collection C à la collection;
9. void clear () supprimer tous les éléments de l'ensemble;
10. VOID REPOVEALL (Collection C) Supprimer les éléments de l'ensemble C-Collection de la collection;
11. VOID RETAINALL (Collection C) Supprimez l'élément qui n'inclut pas dans la collection C de la collection.
Interface de liste
La liste est une collection ordonnée qui peut contrôler avec précision la position de chaque insertion d'élément avec cette interface. Les utilisateurs peuvent utiliser des index (la position des éléments dans la liste, similaire à l'appel d'offres) pour accéder aux éléments de la liste, ce qui est similaire au tableau Java. Contrairement à l'ensemble à mentionner ci-dessous, la liste permet les mêmes éléments.
En plus de la méthode iterator () nécessaire pour l'interface de collecte, la liste fournit également une méthode ListIterator () pour renvoyer une interface listoTrator. Par rapport à l'interface d'itérateur standard, Listotrator a certaines méthodes telles que ADD (), permettant des fonctions telles que l'ajout, la suppression, la définition d'éléments, la traversée vers l'avant ou vers l'arrière. Les classes couramment utilisées pour implémenter les interfaces de liste incluent LinkedList, ArrayList, Vector et Stack.
La méthode principale fournie par l'interface de liste:
1. Void add (int index, élément objet) ajoute un objet à l'emplacement spécifié;
2. Boolean Addall (INT stagiaires, collection C) ajoute l'élément de l'ensemble C à la position spécifiée;
3. Object Get (int index) Renvoie l'élément spécifié dans la position désignée dans la liste;
4. indexof (objet o) renvoie la position du premier élément O;
5. Object SupporInt (int index) Supprimez l'élément de la position spécifiée;
6. Set d'objet (int indexEx, élément d'objet) Remplacez les éléments de l'index de position de l'élément pour renvoyer l'élément remplaçable.
Interface cartographique
MAP n'a pas hérité de l'interface Colleg. MAP fournit un mappage de la clé à la valeur. L'interface MAP fournit 3 ensembles de vues.
La méthode principale fournie par la carte:
1. Boolean est égal (objet O) Objet de comparaison;
2. Boolean Retirez (objet o) Supprimer un objet;
3. Put (clé d'objet, valeur d'objet) Ajouter une clé et une valeur.
Interface aléatoire
L'interface RandomAccess est une interface de logo, qui ne fournit aucune méthode elle-même. L'objectif principal de cette interface est d'identifier l'implémentation de la liste qui peut prendre en charge un accès rapide et aléatoire. Toute implémentation de la liste basée sur des tableaux implémente l'interface RaodomAccess, tandis que les implémentations basées sur la liste liées ne le font pas. Étant donné que seul le tableau peut effectuer un accès aléatoire rapide, l'accès aléatoire à la liste liée doit être traversé par la liste liée. Par conséquent, l'avantage de cette interface est que dans l'application, vous pouvez savoir si l'objet de liste qui est traité peut effectuer un accès rapide et aléatoire, afin d'effectuer différentes opérations pour une liste différente pour améliorer les performances du programme.
Introduction
Classe LinkedList
LinkedList implémente l'interface de liste et permet des éléments nuls. De plus, LinkedList fournit des méthodes GET, Supprimer, Insérer et d'autres méthodes supplémentaires pour faire fonctionner les données au premier ou à la queue de LinkedList. Ces opérations font que LinkedList peut être utilisée comme piles, file d'attente (file d'attente) ou files d'attente à deux voies. Veuillez noter que LinkedList n'a pas de méthode de synchronisation. Une solution consiste à construire une liste synchrone lors de la création de liste.
List list = collections.SynchronizedList (new LinkedList (…));
Classe ArrayList
ArrayList implémente un tableau de taille variable. Il permet tous les éléments, y compris null. La taille, l'isempté, le grenage, le jeu et d'autres méthodes sont du temps d'exécution, mais la surcharge de méthode ADD est la constante du partage.
Chaque instance ArrayList a une capacité (capacité) pour stocker la taille de la gamme d'éléments de stockage. Lorsqu'une grande quantité d'éléments doit être insérée, vous pouvez appeler la méthode d'assurance avant d'insérer pour augmenter la capacité d'ArrayList pour améliorer l'efficacité d'insertion. Comme LinkedList, ArrayList est également un thread -Not -Synchronized (unxynchronisé).
La méthode principale fournie par ArrayList:
1. Boolean Add (objet O) ajoute l'élément spécifié à la fin de la liste;
2. Boolean Add (int indexEx, élément d'objet) pour spécifier la position pour ajouter l'élément spécifié dans la liste;
3. Boolean Addall (Collection C) ajoute l'ensemble spécifié à la fin de la liste;
4. Boolean Addall (int interleg, collection c) Ajouter une collection spécifiée dans l'emplacement spécifié dans la liste;
5. Boolean Clear () Supprimer tous les éléments de la liste;
6. Boolean Clone () revient à une copie de la liste de la liste;
7. Booléen contient (objet o) déterminer s'il contient des éléments dans la liste;
8. Boolean Assurecacity (INT M) augmente la capacité de la liste.
9. Object Get (int index) Renvoie l'élément spécifié dans la liste dans la liste;
10. INDEXOF (Object Elem) dans la liste trouve l'appel d'offres de l'élément spécifié;
11. int size () renvoie le nombre d'éléments de la liste actuelle.
Classe vectorielle
Le vecteur est très similaire à ArrayList, la différence est que le vecteur est synchronisé par les threads. L'itérateur créé par Vector, bien que l'itérateur créé par ArrayList soit le même port, car le vecteur est synchronisé, lorsqu'un itérateur a été créé et utilisé, l'autre thread a changé l'état du vecteur (par exemple, en ajoutant ou en supprimant certains des certains des éléments Éléments d'état), lorsque la méthode de l'itérateur est appelée, la conception de laModification ConcurrentModification sera jetée, de sorte que l'exception doit être capturée.
Classe de pile
Pile héritée du vecteur et réalisé une pile qui a ensuite été avancée. La pile fournit 5 méthodes supplémentaires pour que le vecteur soit utilisé comme piles. En plus des méthodes de base de push et de pop, il existe également la méthode PEEK pour obtenir l'élément du haut de la pile. empiler. Notez qu'après la création de pile, c'était une pile vide.
Se dérouler
SET est une collection sans éléments répétés, c'est-à-dire que deux éléments E1 et E2 ont e1.equals (e2) = false. Il y a un élément nul au plus. De toute évidence, le constructeur de l'ensemble a une condition de contrainte et l'entrée des paramètres de collecte ne peut pas inclure des éléments en double. Veuillez noter que vous devez faire fonctionner soigneusement les objets variables.
Classe de hachage
Le hashable hérite de l'interface MAP et implémente un tableau de hachage basé sur le mappage de valeurs clés. Tout objet non nulle peut être utilisé comme clé ou valeur. Ajoutez des données à utiliser PUT (clé, valeur) et retirer les données à utiliser Get (clé).
Le hashtable ajuste les performances à travers les deux paramètres de la capacité initiale et du facteur de charge. Le facteur de charge par défaut 0,75 atteint mieux la balance du temps et de l'espace. L'augmentation du facteur de charge peut économiser de l'espace, mais le temps de recherche correspondant augmentera, ce qui affectera les opérations comme Get and Put. Utilisez l'exemple simple de hashable pour mettre les trois nombres de 1, 2 et 3 dans le hashtable.
Liste 2. Exemple de hachage
HashTable Numbers = new HashTable (); nombres.put («un», nouvel entier (1)); nombres.put («Two», nouvel entier (2)); nombres.put («trois», nouvel entier (3 ));
Si nous devons retirer un nombre, comme 2, nous pouvons utiliser la clé correspondante pour le retirer, et le code est affiché dans la liste 3.
Liste 3. Lire les données de Hastable
Entier n = (entier) nombres.get ("deux");
Étant donné que l'objet de la clé sera déterminé en calculant sa fonction de distribution pour déterminer la position de la valeur correspondante, tout objet en tant que clé doit implémenter le code de hash et égal aux méthodes. HashCode et égal aux méthodes Hérite de l'objet racine. = Vrai, alors leur HashCode doit être le même, mais si les deux objets sont différents, leur code de hash n'est pas nécessairement différent. Méthode HashCode () qui peut accélérer le fonctionnement des tables de hachage.
Si le même objet a un code de hachage différent, il y aura des résultats inattendus pour le fonctionnement de la table de hachage (au plaisir de retourner NULL) pour éviter ce problème, il est préférable d'écrire la méthode Equals et la méthode HashCode en même temps, en même temps, Au lieu d'écrire l'un d'eux.
Classe de hashmap
Hashmap est similaire à Hashtable. Cependant, lorsque le hashmap est considéré comme la méthode de collection (la méthode VALEUR () peut être renvoyée), elle est proportionnelle à la surcharge de temps de sous-opération itérative et à la capacité de HashMAP. Par conséquent, si les performances de l'opération d'itération sont très importantes, ne définissez pas la capacité d'initialisation de HashMap trop élevée ou définissez trop faible dans le paramètre du facteur de charge.
Classe faiblehashmap
LowerHashMap est un hashmap amélioré qui "référence faible" pour la clé. Si une clé n'est plus citée par l'extérieur, la clé peut être recyclée par GC.
Pratique des cours de collecte
ArrayList, Vector et LinkedList sont tous implémentés à partir de AbstractList, et AbstractList implémente directement l'interface de liste et est étendu à partir d'AbstarctCollection. ArrayList et Vector Utilisent les tableaux pour implémenter. LinkedList utilise une structure de données liée à deux voies circulaires, qui est connectée par une série d'éléments de table.
Lorsque la demande de capacité d'ArrayList dépasse la taille du tableau actuel, il doit être élargi. Pendant le processus d'expansion de la capacité, un grand nombre d'opérations de réplication du tableau seront effectuées et lorsque le tableau sera reproduit, la méthode System.ArrayCopy () sera finalement appelée. Étant donné que la liste Linked utilise la structure de la liste liée, il n'a pas besoin de maintenir la taille de la capacité. En raison de la continuité du tableau, lorsque l'élément est toujours augmenté à la fin, l'expansion du tableau et la réplication du tableau ne peuvent être générées que lorsque l'espace est insuffisant.
ArrayList est basé sur le tableau et le tableau est un espace mémoire continu. LinkedList ne diminue pas les performances en raison de l'insertion de données.
Chaque élément efficace de ArrayList doit être réorganisé après la suppression des opérations, et plus le positionnement de la position de l'élément supprimé est élevé, plus les frais généraux sont élevés pendant la réorganisation du tableau. LinkedList doit supprimer les données intermédiaires pour une demi-liste.
Liste 4. ArrayList et LinkedList Utiliser le code
Importer java.util.arraylist; = Nouveau objet (); m. (); 0, obj2);} end = System.CurrentTtimeMillis (); 1000; i ++) {list1.add (obj1);} end = System.CurrentTtimeMillis (); System.CurrentTtimeMillis (); ;}}
Liste 5. Exécuter la sortie
639129669690015
Hashmap est de créer l'algorithme clé, puis de cartographier la valeur de hachage à l'adresse mémoire pour obtenir directement les données correspondant à la clé. Dans Hashmap, la structure de données sous-jacente utilise un tableau, l'adresse mémoire SO est l'indice d'étiquette du tableau. Les performances élevées de Hashmap nécessitent les points suivants:
1. L'algorithme de hachage doit être efficace;
2. L'algorithme de la valeur de hachage à l'adresse mémoire (index du tableau) est rapide;
3. Selon l'adresse mémoire (index du tableau), vous pouvez obtenir directement la valeur correspondante.
Hashmap est en fait un tableau d'une liste liée. Comme mentionné précédemment, le mécanisme de mise en œuvre basé sur la méthode de liste liée basée sur le hashmap, tant que les méthodes HashCode () et Hash () sont suffisamment réalisées pour réduire la survenue du conflit autant que possible, puis le fonctionnement de HashMap est Presque équivalent à l'accès aléatoire au tableau des tableaux. Cependant, si la méthode HashCode () ou Hash () est mal atteinte, dans le cas d'un grand nombre de conflits, le HashMap est en fait dégradé en plusieurs listes liées, ce qui est équivalent à la liste liée pour le fonctionnement de HashMap. Cette fois, la performance est très médiocre.
Un inconvénient fonctionnel de Hashmap est son trouble, qui est stocké dans les éléments de Hashmap. Si vous souhaitez conserver l'ordre d'entrée, vous pouvez utiliser LinkedHashmap à la place.
LinkedHashMap hérite de Hashmap et a une efficacité élevée.
Hashmap peut fonctionner put () et get () aussi vite que l'algorithme de hachage. Treemap fournit une implémentation de carte complètement différente. En termes de fonction, Treemap a une fonctionnalité plus puissante que HashMap. Les performances de Treemap sont légèrement inférieures à celles de hashmap. Si vous devez trier les éléments du développement, vous ne pouvez pas implémenter cette fonction avec HashMap. LinkedHashMap est basé sur l'ordre de l'élément entrant dans la collection ou l'ordre séquentiel pour être accessible.
LinkedHashmap est trié en fonction de l'ordre de l'augmentation ou de l'accès de l'élément, tandis que Treemap est trié en fonction de la clé de l'élément.
Listing 6 montre que le code démontre l'ordre de la logique commerciale à l'aide de Treemap.
Listing 6. Treemap implémente le tri
Importer Java.util.iterator; name; (O.score> this.score) {return -1;} return 0;} @OverridePublic String toString () {StringBuffer sb = new StringBuffer (); ; (); Student S1 = New Student ("1", 100); Student S2 = New Student ("2", 99); Student S3 = New Student ("3", 97); Student S4 = New Student ("4 ", 91); map.put (S1, New StudentDetailinfo (S1)); map.put (S2, New StudentDetailinfo (S2)); Map.put (S3, New Studentdetailinfo (S3)); S4, New StudentDetailinfo (S4 )); Suivant (); System.out.println (Key + "->" + map.get (key));} System.out.println ("" subap (s1); pour (iterator iterator = map1.KeySet (). (key));} System.out.println ("endmap end"); ;) {Student Key = (Student) iTrator. (Student S) {this.s = s;} @ OUNRIDEPUBLIC String toString () {return S.Name + "S Detail Information";}}
Liste 7. Exécuter la sortie
Nom: 4 Score: 91-> 4's Detail InformationName: 3 Score: 97-> 3's Detail InformationsBmap Endname: 4 Score: 91-> 4's Detail InformationName: 3 Score: 97-> 3's Detail Information Name: 2 Score: 99- > 2's Detail InformationsBmap Endname: 1 Score: 100-> 1's Detail InformationsBmap end
WIBLEHASHMAP se caractérise par lui-même que s'il n'y a pas d'autre dans cette clé, sauf pour ses citations, cette carte éliminera automatiquement la valeur. Comme indiqué dans Listing 8, le code montre deux objets MAP, l'un est HashMap, et l'autre est faible. Null, ils pointent vers Null. La raison de cette situation est que pour l'objet a, lorsque le hashmap est supprimé et a à null, en plus de faiblehashmap, il n'y a pas de pointeur vers A sauf a bien que pointé vers nul conservera l'objet B.
Liste 8. Code d'exemple
Importation java.util.hashmap; String ("A"); String B = New String (B "); , B, b, b, b, b, b, b, b, b, b, b, "bbb"); , "BBB"); .Entry en = (map.entry) iZext (); . + En.getValue ());
Listing 9. Exécuter la sortie
Carte: b: bbbweakmap: b: bbb
WIBLHASHMAP atteint principalement le but de supprimer les entrées inutilisées internes par le biais d'expungestalentries, atteignant ainsi le but de libérer automatiquement la mémoire. Fondamentalement, tant que le contenu de WIBLHashmap est accessible, cette fonction sera appelée pour réaliser l'entrée interne qui n'est plus référencée. Mais si vous êtes devenu un faiblehashmap, et avant le GC, vous n'avez jamais visité le faiblehashmap, n'est-il pas illimité de libérer la mémoire?
Liste 10. FaiblehashMaptest1
Importer Java.util.ArrayList; ] [] >> maps = new ArrayList <WewHashMap <byte [] [], byte [] [] >> (); BYTE [] []> D = nouveau FaibleHashMap <Byte [] [], Byte [] []> (); .add (d); System.gc ();
Ne modifiez aucun paramètre JVM en cours d'exécution 10 illustré dans la liste des opérations.
Liste 11. Exécuter la sortie
241242243Excetion dans le thread "Main" Java.lang.outofMemoryError: Java Heap Spaceat WaiwhashMaptest1.main (faiblehashmapst1.java:10)
Effectivement, faiblehashmap n'a pas automatiquement libéré de la mémoire inutile pour le moment. Le code indiqué dans Listing 12 n'aura pas de débordement de mémoire.
Liste 12. FaiblehashMaptest2
Importer java.util.arraylist; ] [] >> maps = new ArrayList <WewHashMap <byte [] [], byte [] [] >> (); BYTE [] []> D = nouveau FaibleHashMap <Byte [] [], Byte [] []> (); .add (d); System.gc (); .Get (j) .size ());}}}}
Les résultats de l'opération ont révélé que la sortie de test était normale et le problème du débordement de la mémoire ne se produisait plus.
En général, le faiblehashmap n'est pas un objet qui n'est pas utilisé à l'intérieur si vous faites quoi que ce soit, mais relâchez l'objet interne inutilisé lorsque vous y accédez.
LowerHashMap met en œuvre des références faibles car son entrée <k, v> est héritée de la référence faible <k>.
Dans la définition et le constructeur de la classe de la saisie de la liste des bashashmap <k, v>, il est montré dans la liste 13.
Liste 13. Définition de la classe Faiblehashmap
Entrée de classe statique privée <k, v> étend FaibleReference <K> implémente map.Entry <k, v> Entrée (key k, valeur v, référence <K> file d'attente, hachage int, entrée <k, v> suivant) {super (clé, file d'attente);
Veuillez noter qu'il construit une déclaration de classe Père: "Super (clé, file d'attente);"; Dans System.gc (), le tableau d'octets dans la clé est recyclé et la valeur reste (la valeur est fortement associée à l'entrée, l'entrée est associée dans la carte et la carte est associée dans ArrayList).
Every time I have a new Weakhashmap every time, after the PUT operation, although the GC recycles the Byte array in Weakreference Key, and notify the event to ReferenceQueue, there is no corresponding action to trigger Weakhashmap to handle Referenceq ueue Therefore, the weakreference packaging La clé existe toujours dans faiblehashmap, et sa valeur correspondante existe également.
Quand la valeur est-elle effacée? ? Vérifiez le code source FaibleHashMap. Par conséquent, l'effet est que la clé a été effacée lorsque GC, et la valeur a visité lamhashmap faible après que la clé a été effacée.
La classe FaiblehashMap est non-synchronisée. Par conséquent, que ce soit dans le mappage ou à l'extérieur de la cartographie, la clé est automatiquement supprimée uniquement après que le recyler à ordures supprime la référence faible à une certaine clé. Il convient de noter que l'objet de valeur dans le faiblehashmap est conservé par l'attraction générale. Par conséquent, vous devez veiller à vous assurer que l'objet de valeur ne fera pas directement ou indirectement ses propres clés, car cela empêchera la tension de rejeter. Notez que l'objet de valeur peut indiquer indirectement la clé correspondante via le faiblehashmap lui-même, ce qui signifie qu'un certain objet de valeur peut être fortement référencé par d'autres objets clés, et l'objet de valeur associé à l'objet clé se tourne vers le premier pour référencer le premier un.
Une façon de gérer ce problème est d'emballer la valeur elle-même dans les références faibles avant d'insérer, telles que: m.put (clé, nouvelle référence faible (valeur)), puis utiliser Get to Dissection. "Le dispositif de support est rapidement échoué. Une fois le dispositif itératif créé, si le mappage est modifié à partir de la structure, à moins que la méthode de suppression ou d'ajout de l'itérateur ne soit modifiée à tout moment et de quelque manière que ce soit, et l'itérateur sera Jetez la conception de laModification Concurrent. Par conséquent, face à la modification de la concurrence, l'itérateur a rapidement échoué complètement, plutôt que de risquer de comportement incertain arbitraire à tout moment à l'avenir.
Notez que nous ne pouvons pas nous assurer que l'itérateur échoue.
Pour résumer l'introduction et le code d'instance dans le complet, nous pouvons savoir que s'il implique des piles, des files d'attente, etc., nous devrions envisager d'utiliser la liste. Pour les opérations telles que l'insertion rapide et la suppression des éléments, LinkedList doit être utilisé. Si vous devez accéder rapidement aux éléments, vous devez utiliser ArrayList. Si le programme est effectué dans un environnement unique ou l'accès uniquement dans un seul thread, en considérant les classes non synchronisées, elle est efficace. Si plusieurs threads peuvent faire fonctionner une classe en même temps, la classe synchrone doit être utilisée. Portez une attention particulière au fonctionnement de la table de hachage, et l'objet des égaux et de HashCode en tant que clé est d'écrire correctement les méthodes Equals et HashCode. Essayez de renvoyer l'interface au lieu de types réels, tels que la liste de retour au lieu de ArrayList, de sorte que si ArrayList doit être remplacé par LinkedList à l'avenir, le code client n'a pas besoin de changer.
Cet article est uniquement pour le partage du niveau d'application.