CodeGym /Blog Java /Aleatoriu /LinkedHashSet în Java
John Squirrels
Nivel
San Francisco

LinkedHashSet în Java

Publicat în grup
Vorbind despre clasa LinkedHashSet din Java, trebuie să menționăm că implementează interfața Set . LinkedHashSet creează o colecție care stochează elemente într-un tabel hash, dar menține ordinea de inserare a elementelor, spre deosebire de omologul său HashSet .

Ce este setat în Java

Să ne amintim pe scurt că interfața Set definește un set (set). Extinde Colecția și definește comportamentul colecțiilor care nu permit elemente duplicate. Astfel, metoda add() returnează false dacă se încearcă adăugarea unui element duplicat la set. Interfața nu definește nicio metodă suplimentară proprie. Interfața Set are grijă de unicitatea obiectelor stocate, unicitatea este determinată de implementarea metodei equals() . Prin urmare, dacă obiectele clasei create vor fi adăugate la Set , este de dorit să se suprascrie metoda equals() .

Clasa LinkedHashSet

Înainte de a vorbi despre clasa LinkedHashSet , trebuie să menționăm ruda ei apropiată, clasa HashSet . HashSet implementează interfața Set . Acesta creează o colecție care stochează elementele într-un tabel hash. Elementele unui tabel hash sunt stocate ca perechi cheie-valoare. Cheia specifică celula (sau segmentul) pentru a stoca valoarea. Conținutul cheii este folosit pentru a determina o valoare unică numită cod hash. Ne putem gândi la un cod hash ca la un identificator de obiect, deși nu trebuie să fie unic. Acest cod hash servește și ca index în care sunt stocate datele asociate cheii. Clasa Java LinkedHashSet extinde HashSet fără a adăuga metode noi.LinkedHashSet vă permite să verificați rapid existența unei intrări, la fel ca HashSet , dar conține o listă ordonată în interior. Aceasta înseamnă că stochează ordinea de inserare a elementelor. Cu alte cuvinte, LinkedHashSet menține o listă legată de elemente de set în ordinea în care au fost inserate. Acest lucru permite iterația ordonată a inserției într-un set. Dar acest lucru face ca clasa LinkedHashSet să efectueze operații mai lungi decât clasa HashSet .

Caracteristici importante ale LinkedHashSet

  • Putem stoca elemente unice doar într-un LinkedHashSet

  • LinketHashSet ne permite să extragem elemente în aceeași ordine în care inserăm

  • LinkedHashSet nu este sincronizat

  • LinkedHashSet permite stocarea elementelor nule

  • LinkedHashSet folosește o tehnică hash pentru a stoca elemente la un index specificat pe baza unui cod hash

Metode LinkedHashSet

Pe lângă metodele moștenite de la clasele părinte, HashSet definește următoarele metode:
  • boolean add(Object o) adaugă elementul specificat la acest set dacă nu este deja prezent.

  • void clear() elimină toate elementele din acest set.

  • Object clone() returnează o copie superficială a acestei instanțe LinkedHashSet : elementele în sine nu sunt clonate.

  • boolean contains(Object o) returnează adevărat dacă acest set conține elementul specificat.

  • boolean isEmpty() returnează adevărat dacă acest set nu conține elemente.

  • Iterator iterator() returnează un iterator peste elementele acestui set.

  • boolean remove(Object o) elimină elementul specificat din acest set, dacă este prezent.

  • int size() returnează numărul de elemente din acest set (numărul său de elemente).

Exemple ușoare de LinkedHashSet În exemplul de mai jos arătăm inițializarea obiectului LinkedHashSet și folosirea metodei add() pentru a completa setul.

import java.util.LinkedHashSet;
import java.util.Set;

   public class LinkedHashSetEx1 {
       public static void main(String[] args) {
//LinkedHashSet() Init            
Set<String> set = new LinkedHashSet<>();
//adding elements to LinkedHashSet 
           set.add("Re"); //first added element 
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");//last added element  


           System.out.println(set);
       }
   }
Ieșirea este:
[Re, Do, Fa, Sol, La, Ti, Mi]
După cum puteți vedea, elementele din setul nostru au apărut în aceeași ordine în care le-am plasat. LinkedHashSet în Java - 1

Exemplul 2. Adăugarea unui duplicat în LinkedHashSet

Să punem din nou în LinkedHashSet 7 elemente cu nume de partituri muzicale și să punem un element nou care este același cu unul dintre elementele plasate înainte.

import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetEx2 {
   public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           set.add("Sol");
           System.out.println(set);
       }
   }
Ieșirea programului este aici:
[Re, Do, Fa, Sol, La, Ti, Mi]
Ieșirea exemplului doi este exact aceeași ca în primul exemplu. Nu putem avea două elemente similare în colecția LinkedHashSet . Când încercăm să-l punem pe al doilea, pur și simplu este ignorat.

Exemplul 3. Eliminarea elementelor din LinkedHashSet


import java.util.LinkedHashSet;
import java.util.Set;
   public class LinkedHashSet3 {
       public static void main(String[] args) {
           Set<String> set = new LinkedHashSet<>();
           set.add("Re");
           set.add("Do");
           set.add("Fa");
           set.add("Sol");
           set.add("La");
           set.add("Ti");
           set.add("Mi");
           System.out.println(set);
           set.remove("Fa");// removing an element from our set
           set.remove("Score");//trying to remove element that isn't in set
           System.out.println(set.remove("Score"));
           System.out.println("Print our set without elements removed: ");
           System.out.println(set);
           set.clear();
           System.out.println("Print out our set after clear command: ");
           System.out.println(set);
       }
   }
Ieșirea programului este aici:
[Re, Do, Fa, Sol, La, Ti, Mi] false Tipăriți setul nostru fără elementele eliminate: [Re, Do, Sol, La, Ti, Mi] Tipăriți setul nostru după comanda clară: []
După cum puteți vedea, metoda remove() aplicată unui element inexistent nu are ca rezultat o eroare de program. Pur și simplu returnează false dacă elementul nu a fost eliminat și adevărat dacă elementul a fost în LinkedHashSet și apoi a fost eliminat.

LinkedHashSet vs HashSet

Aceste două clase sunt rude apropiate. Cu toate acestea, în interiorul HashSet, folosește HashMap pentru a stoca obiecte, în timp ce LinkedHashSet folosește LinkedHashMap . Dacă nu trebuie să mențineți ordinea de inserare, dar trebuie să stocați obiecte unice, este mai potrivit să utilizați HashSet . Dacă trebuie să mențineți ordinea de inserare a elementelor, atunci LinkedHashSet este alegerea dvs. Performanța LinkedHashSet este puțin mai lentă decât HashSet , deoarece LinkedHashSet utilizează LinkedList intern pentru a menține ordinea de inserare a elementelor. Să avem un exemplu:

import java.util.*;

public class LinkedHashSetExample1 {

   public static void main(String[] args) {
       // while regular hash set orders its elements according to its hashcode stamps

       Set<Integer> regularHashSet = new HashSet<>();
       regularHashSet.add(7);
       regularHashSet.add(3);
       regularHashSet.add(5);
       regularHashSet.add(65536);
       regularHashSet.add(9);
       // few duplicates
       regularHashSet.add(5);
       regularHashSet.add(7);

       // next will print:
       // > regularHashSet = [65536, 3, 5, 7, 9]
       System.out.println("regularHashSet = " + regularHashSet);

       // linked hash set keeps order of adding unchanged

       Set<Integer> linkedHashSet = new LinkedHashSet<>();
       linkedHashSet.add(7);
       linkedHashSet.add(3);
       linkedHashSet.add(5);
       linkedHashSet.add(65536);
       linkedHashSet.add(9);
       // few duplicates
       linkedHashSet.add(5);
       linkedHashSet.add(7);

       // next will print:
       // > linkedHashSet = [7, 3, 5, 65536, 9]
       System.out.println("linkedHashSet = " + linkedHashSet);
   }
}
Rezultatul programului este:
regularHashSet = [65536, 3, 5, 7, 9] linkedHashSet = [7, 3, 5, 65536, 9]

Utilizarea Java LinkedHashSet în aplicațiile din lumea reală

Deoarece LinkedHashSet vă permite să verificați rapid existența unei intrări și, de asemenea, să stocheze o comandă, această colecție pare a fi destul de convenabilă pentru eliminarea duplicatelor dintr-o listă. Sau, de exemplu, rezolvarea unor probleme precum ultimul articol văzut recent din geanta mea. Sau, vă amintiți un astfel de joc, Pokemon Go? LinkedHashSet poate stoca o listă de Pokemon pe care i-ai întâlnit și ordinea în care au apărut pe calea ta. În acest caz, Pokémonul „repetat” nu va mai fi adăugat la listă. Sau, de exemplu, o listă de șefi după nivel pe care i-ați întâlnit deja în orice joc cu niveluri. Sau istoria descoperirii corpurilor cosmice. LinkedHashSetvă permite să verificați rapid dacă un corp spațial este deja în listă sau nu și, dacă nu este acolo, adăugați-l în listă. Să luăm un exemplu de eliminare a duplicatelor.

import java.util.*;

class LinkedHashSetExample2 {
   public static void main(String[] args) {
       List<String> listWithDuplicates = List.of("some","elements","with", "few", "duplicates", "were", "here", "duplicates", "duplicates");

       Set<String> linkedHashSet = new LinkedHashSet<>(listWithDuplicates);
       List<String> listWithoutDuplicates = new ArrayList<>(linkedHashSet);

       // next will print:
       // > listWithDuplicates = [some, elements, with, few, duplicates, here, duplicates, duplicates]
       System.out.println("listWithDuplicates = " + listWithDuplicates);
       // next will print:
       // > listWithoutDuplicates = [some, elements, with, few, duplicates, here]
       System.out.println("listWithoutDuplicates = " + listWithoutDuplicates);

       // -------------------------------------------------------------------------

       // while using regular Hash Set will generally produces some unexpected order
       Set<String> regularHashSet = new HashSet<>(listWithDuplicates);

       // next will print:
       // > linkedHashSet = [some, elements, with, few, duplicates, were, here]
       System.out.println("linkedHashSet = " + linkedHashSet);
       // next will print:
       // > regularHashSet = [here, some, with, duplicates, were, elements, few]
       System.out.println("regularHashSet = " + regularHashSet);
   }
}
Ieșirea programului este aici:
listWithDuplicates = [unele, elemente, cu, câteva, duplicate, au fost, aici, duplicate, duplicate] listWithoutDuplicates = [unele, elemente, cu, câteva, duplicate, au fost, aici] linkedHashSet = [unele, elemente, cu, câteva, duplicate , were, here] regularHashSet = [aici, unele, cu, duplicate, erau, elemente, puține]
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION