Ha már a Java LinkedHashSet osztályáról beszélünk , meg kell említenünk, hogy a Set felületet valósítja meg. A LinkedHashSet létrehoz egy gyűjteményt, amely az elemeket egy hash táblában tárolja, de megtartja az elemek beillesztési sorrendjét, ellentétben a HashSet megfelelőjével.

Mi van beállítva a Java-ban

Emlékezzünk vissza röviden, hogy a Set interfész egy halmazt (halmazt) határoz meg. Kibővíti a gyűjteményt , és meghatározza azon gyűjtemények viselkedését, amelyek nem engedélyezik az elemek ismétlődését. Így az add() metódus false értéket ad vissza , ha egy ismétlődő elemet próbálnak hozzáadni a halmazhoz. Az interfész nem határoz meg további saját metódusokat. A Set felület gondoskodik a tárolt objektumok egyediségéről, az egyediséget az equals() metódus implementációja határozza meg. Ezért, ha a létrehozott osztály objektumai hozzáadásra kerülnek a Set -hez , kívánatos az equals() metódus felülbírálása.

LinkedHashSet osztály

Mielőtt a LinkedHashSet osztályról beszélnénk , meg kell említenünk közeli rokonát, a HashSet osztályt. A HashSet megvalósítja a Set interfészt. Létrehoz egy gyűjteményt, amely az elemeket egy hash táblában tárolja. A hash tábla elemei kulcs-érték párokként vannak tárolva. A kulcs megadja az érték tárolására szolgáló cellát (vagy szegmenst). A kulcs tartalma egy egyedi érték meghatározására szolgál, amelyet hash kódnak neveznek. A hash kódot felfoghatjuk objektumazonosítónak, bár ennek nem kell egyedinek lennie. Ez a hash kód egyben indexként is szolgál, amely a kulcshoz tartozó adatokat tárolja. A LinkedHashSet Java osztály új metódusok hozzáadása nélkül bővíti ki a HashSet-et .A LinkedHashSet lehetővé teszi, hogy gyorsan ellenőrizze egy bejegyzés létezését, akárcsak a HashSet , de tartalmaz egy rendezett listát. Ez azt jelenti, hogy tárolja az elemek beillesztési sorrendjét. Más szavakkal, a LinkedHashSet a halmazelemek csatolt listáját a beillesztésük sorrendjében tartja fenn. Ez lehetővé teszi a halmazba történő beillesztés rendezett iterációját. Ez azonban azt eredményezi, hogy a LinkedHashSet osztály hosszabb ideig hajt végre műveleteket, mint a HashSet osztály.

A LinkedHashSet fontos tulajdonságai

  • Egyedi elemeket csak LinkedHashSet- ben tudunk tárolni

  • A LinketHashSet lehetővé teszi, hogy az elemeket ugyanabban a sorrendben bontsuk ki, mint ahogyan beszúrjuk

  • A LinkedHashSet nincs szinkronizálva

  • A LinkedHashSet lehetővé teszi a null elemek tárolását

  • A LinkedHashSet kivonatolási technikát használ az elemek meghatározott indexen történő tárolására egy hash kód alapján

LinkedHashSet Methods

A szülőosztályaitól örökölt metódusokon kívül a HashSet a következő metódusokat határozza meg:
  • A boolean add(Object o) hozzáadja a megadott elemet ehhez a halmazhoz, ha az még nincs jelen.

  • A void clear() minden elemet eltávolít ebből a halmazból.

  • Az Object clone() ennek a LinkedHashSet példánynak egy sekély másolatát adja vissza: maguk az elemek nincsenek klónozva.

  • A boolean include(Object o) értéke igaz, ha ez a halmaz tartalmazza a megadott elemet.

  • A boolean isEmpty() igazat ad vissza , ha ez a halmaz nem tartalmaz elemeket.

  • Az iterator() az iterátor() egy iterátort ad vissza a halmaz elemei felett.

  • A boolean remove(Object o) eltávolítja a megadott elemet ebből a halmazból, ha van.

  • Az int size() a halmaz elemeinek számát adja vissza (elemeinek számát).

Egyszerű LinkedHashSet példák Az alábbi példában bemutatjuk a LinkedHashSet objektum inicializálását és az add() metódus használatát a halmaz kitöltéséhez.

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);
       }
   }
A kimenet a következő:
[Re, Do, Fa, Sol, La, Ti, Mi]
Amint látja, a készletünkben szereplő elemek abban a sorrendben jelentek meg, ahogyan elhelyeztük őket. LinkedHashSet Java nyelven – 1

2. példa: Duplikátum hozzáadása a LinkedHashSet-hez

Tegyük be ismét a LinkedHashSet 7 elemét a kottanevekkel, és tegyünk egy új elemet, amely megegyezik az előzőleg elhelyezett elemekkel.

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);
       }
   }
A program kimenete itt található:
[Re, Do, Fa, Sol, La, Ti, Mi]
A második példa kimenete pontosan ugyanaz, mint az első példában. Nem lehet két hasonló elem a LinkedHashSet gyűjteményben. Amikor megpróbáljuk feltenni a másodikat, azt figyelmen kívül hagyjuk.

3. példa Elemek eltávolítása a LinkedHashSetből


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);
       }
   }
A program kimenete itt található:
[Re, Do, Fa, Sol, La, Ti, Mi] false Nyomtassa ki készletünket eltávolított elemek nélkül: [Re, Do, Sol, La, Ti, Mi] Nyomtassa ki készletünket egyértelmű parancs után: []
Mint látható, a nem létező elemre alkalmazott remove() metódus nem eredményez programhibát. Egyszerűen false értéket ad vissza , ha az elemet nem távolították el, és igazat , ha az elem a LinkedHashSetben volt , majd eltávolították.

LinkedHashSet vs HashSet

Ez a két osztály közeli rokon. A HashSet- en belül azonban a HashMap-et használja az objektumok tárolására, míg a LinkedHashSet a LinkedHashMap-et használja . Ha nem kell fenntartania a beillesztési sorrendet, hanem egyedi objektumokat kell tárolnia, célszerűbb a HashSet használata . Ha fenn kell tartania az elemek beillesztési sorrendjét, akkor a LinkedHashSet az Ön választása. A LinkedHashSet teljesítménye egy kicsit lassabb, mint a HashSet , mivel a LinkedHashSet belső LinkedList segítségével tartja fenn az elemek beillesztési sorrendjét. Vegyünk egy példát:

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);
   }
}
A program kimenete:
regularHashSet = [65536, 3, 5, 7, 9] linkedHashSet = [7, 3, 5, 65536, 9]

Java LinkedHashSet használata valós alkalmazásokban

Mivel a LinkedHashSet lehetővé teszi a bejegyzések meglétének gyors ellenőrzését és a rendelések tárolását is, ez a gyűjtemény meglehetősen kényelmesnek tűnik a duplikációk eltávolítására a listáról. Vagy például olyan problémák megoldása, mint az utoljára látott tárgy a táskámban. Vagy emlékszel egy ilyen játékra, a Pokemon Go-ra? A LinkedHashSet tárolhatja az Ön által talált Pokémonok listáját, és azt, hogy milyen sorrendben találkoztak az utadon. Ebben az esetben az „ismételt” Pokémon többé nem kerül fel a listára. Vagy például a főnökök listája szintek szerint, akikkel már találkozott bármelyik szinttel rendelkező játékban. Vagy a kozmikus testek felfedezésének története. LinkedHashSetsegítségével gyorsan ellenőrizheti, hogy egy szóköztörzs szerepel-e már a listában vagy sem, és ha nincs ott, akkor hozzáadhatja a listához. Vegyünk egy példát az ismétlődések kiküszöbölésére.

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);
   }
}
A program kimenete itt található:
listWithDuplicates = [some, elements, with, little, duplicates, were, here, duplicates, duplicates] listWithoutDuplicates = [some, elements, with, little, duplicates, were, here] linkedHashSet = [some, elements, with, little, duplicates , were, here] regularHashSet = [itt, néhány, with, duplicates, were, elements, kevés]