Mi az a Java Set
A Set a Java Collection Framework felülete, de a Set nem egy rendezett gyűjtemény, ellentétben a Listával . Ez azt jelenti, hogy a Java Set elemeket külön sorrend nélkül tartják meg. Így nincs befolyása az elem beszúrásának helyére. Az elemekhez az indexük alapján sem lehet hozzáférni. Matematikailag a halmaz egyedi elemek gyűjteménye. Valójában ez egy rendezetlen gyűjtemény (rendezetlen gyűjtemény), amelyben nem tárolhatók azonos elemek. Ha szándékosan ismétlődő elemet ad hozzá egy halmazhoz , akkor ezt a műveletet a rendszer figyelmen kívül hagyja, és a készlet nem változik. Megengedett azonban egy null elem tárolása benne.Megvalósítások beállítása
A Java Set egy interfész, ezért annak valamelyik megvalósítását kell használnia objektumok létrehozásához. Ezek a HashSet , a TreeSet és a LinkedHashSet . A Set s- ben minden elem csak egy példányban kerül tárolásra, és a Set különböző megvalósításai eltérő sorrendet használnak az elemek tárolására. A HashSetben az elemek sorrendjét egy összetett algoritmus határozza meg. Ha a tárolási sorrend fontos az Ön számára, használjon TreeSet tárolót, amely az objektumokat összehasonlítási sorrendben növekvő sorrendben tárolja, vagy egy LinkedHashSet-et ., amely az elemeket kiegészítő sorrendben tárolja. A készleteket gyakran használják a tagság tesztelésére, így könnyen ellenőrizhető, hogy egy objektum egy adott halmazhoz tartozik-e, ezért a gyakorlatban általában a gyors keresésre optimalizált HashSet implementációt választják. A HashSet egy olyan gyűjtemény, amely a hashCode() metódus által visszaadott hash értékeit használja az elemek belső tárolására. Vagyis a HashSet<E> belsejében a HashMap<E, Object> objektum tárolódik, amely kulcsként tárolja a HashSet értékeit. A hash kódok segítségével gyorsan kereshet, elemeket adhat hozzá és eltávolíthat egy készletből . A LinkedHashSet egy HashSetamely szintén egy linkelt listában tárolja az elemeket. A normál HashSet nem tartja fenn az elemek sorrendjét. Először is, hivatalosan egyszerűen nem létezik, másodszor pedig még a belső rend is drámaian megváltozhat, ha csak egy elemet adunk hozzá. És beszerezhet egy iterátort a LinkedHashSet- ből , és ezzel az összes elemet pontosan abban a sorrendben megy végig, ahogyan azokat hozzáadta a LinkedHashSethez . Nem gyakran, de néha nagyon szükséges lehet. A TreeSet egy olyan gyűjtemény, amely értékrendezett faként tárolja az elemeket. A TreeSet<E> belsejében található egy TreeMap<E, Object> , amely ezeket az értékeket tárolja. És ez a TreeMappiros-fekete kiegyensúlyozott bináris fát használ az elemek tárolására. Ezért nagyon gyors add() , remove() , include() műveletekkel rendelkezik .Hozzon létre egy objektumkészletet
Objektumkészlet létrehozásához használhatja a következő űrlapok egyikét:
Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Íme egy egyszerű példa, ahol létrehozunk 2 Set- et, HashSet-et és LinkedHashSet-et , és mindegyikbe hozzáadunk 5 elemet. Ehhez használhatjuk az add() metódust.
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
public class HashSetTest {
public static void main(String[] args) {
Set mySet = new HashSet();
Set mySet2 = new LinkedHashSet();
//adding some string elements
mySet.add("Stuart");
mySet.add("Alex");
mySet.add("Johnny");
mySet.add("Igor");
mySet.add("Bel");
System.out.println(mySet);
mySet2.add("Stuart");
mySet2.add("Alex");
mySet2.add("Johnny");
mySet2.add("Igor");
mySet2.add("Bel");
System.out.println(mySet2);
}
}
Íme a program kimenete:
Java Set Methods
Íme néhány fontos Java Set metódus:-
logikai add(E e) . Hozzáadja a megadott elemet a készlethez, ha még nincs jelen (opcionális művelet).
-
logikai eltávolítás(Object o) . Eltávolítja a megadott elemet ebből a halmazból, ha jelen van (opcionális művelet).
-
boolean removeAll(c gyűjtemény) . Eltávolítja a halmaz összes elemét, amely a megadott gyűjteményben található (opcionális művelet).
-
logikai retenAll(c gyűjtemény) . Csak azokat az elemeket tartja meg ebben a halmazban, amelyek a megadott gyűjteményben találhatók (opcionális művelet).
-
void clear() . Eltávolítja az összes elemet a készletből.
-
Iterátor iterátor() . Egy iterátort ad vissza a halmaz elemei felett.
-
int size() . a Halmaz elemeinek számának lekérésére szolgál.
-
logikai érték isEmpty() . ellenőrizni, hogy a Set üres-e vagy sem.
-
logikai érték tartalmazza (o Object) . Igaz értéket ad vissza, ha ez a halmaz tartalmazza a megadott elemet.
-
Iterátor iterátor() . Egy iterátort ad vissza a halmaz elemei felett. Az elemek nem meghatározott sorrendben kerülnek visszaküldésre.
-
Object[] toArray() . Egy tömböt ad vissza, amely a halmaz összes elemét tartalmazza. Ha ez a halmaz garantálja, hogy az iterátor milyen sorrendben adja vissza elemeit, akkor ennek a metódusnak ugyanabban a sorrendben kell visszaadnia az elemeket.
Java Set fő műveleti példa
Ebben a példában létrehozunk egy karakterlánc-tömböt, majd az Arrays.asList művelettel átadjuk a mySet- nek . Ezután eltávolítunk néhány további elemet, és hozzáadunk még néhányat. Ebben az esetben a készlet egyik eleme már létezik: nem lesz hozzáadva. Megpróbáljuk továbbá az üresség ellenőrzését isEmpty() , a size() halmaz méretének meghatározását és a clear() összes elem halmaz törlését .
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
public class HashSetTest2 {
public static void main(String[] args) {
//creating a string Array with some names
String [] friends = {"Stuart", "Ivy", "Johnny", "Alex", "Igor", "Tanya"};
//creating a new set and adding elements from string array into it
Set<String> mySet = new HashSet<>(Arrays.asList(friends));
System.out.println(mySet);
//removing two elements from the set
mySet.remove("Igor");
mySet.remove("Stuart");
System.out.println(mySet);
//adding 2 new Elements into set
mySet.add("Dasha");
mySet.add("Alex"); //it's second Alex, can't be added
System.out.println(mySet);
//cheking the size of mySet
int size = mySet.size();
System.out.println("The quantity of set's elements = " + size);
//Checking if the set is empty
System.out.println("Is mySet empty? " + mySet.isEmpty());
//checking if some elements are in set
System.out.println("Is Igor in set? " + mySet.contains("Igor"));
System.out.println("Is Johnny in set? "+ mySet.contains("Johnny"));
//deleting all elements from the set
mySet.clear();
System.out.println("Is mySet empty now? " + mySet.isEmpty());
}
}
A program kimenete itt található:
Példa LinkedHashSet-tel, és állítsa az Array-re
Írjunk egy másik programot. Ebben létrehozunk egy halmazt a LinkedHashSet alapján , elemeket adunk hozzá, majd a készletet tömbbé alakítjuk.
import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
public class LinkedHashSet3 {
public static void main(String[] args) {
Set<String> set = new LinkedHashSet<>();
set.add("C");
set.add("D");
set.add("E");
set.add("F");
set.add("G");
set.add("A");
set.add("B");
System.out.println(set);
set.remove("F");// removing an element from our set
set.remove("C sharp");//trying to remove element that isn't in set
System.out.println(set.remove("C sharp"));
System.out.println("Print our set with elements removed: ");
System.out.println(set);
//set to array
String strArray[] = set.toArray(new String[set.size()]);
System.out.println("New Array from set: ");
System.out.println(Arrays.toString(strArray));
System.out.println(strArray[0]);
}
}
Íme a program kimenete:
Mutasson példát az iterátorral
Hozzunk létre egy halmazt, majd iterátor segítségével nyomtassuk ki, majd távolítsunk el belőle minden páros számot, szintén iterátor segítségével.
import java.util.*;
public class SetTest5
{
public static void main(String[] args)
{
Set<Integer> mySet = new HashSe<>();
for(int i = 0; i < 10; i++)
mySet.add(i);
Iterator iterator = mySet.iterator();
//simple iteration
while(iterator.hasNext()){
int i = (int) iterator.next();
}
System.out.println(" " + mySet);
//modification of mySet using iterator - removing all even numbers
iterator = mySet.iterator();
while(iterator.hasNext()){
int x = (int) iterator.next();
if(x%2 == 0) iterator.remove();
}
System.out.println(mySet);
}
}
A program kimenete itt található:
Példa a TreeSettel
Ha a rendezés fontos Önnek, használja a TreeSet implementációt. Ebben a rövid példában az előző példákhoz hasonlóan a barátok nevével fogjuk kitölteni a halmazt. A rendezett TreeSetben azonban az elemek azonnal rendezett sorrendbe kerülnek. Ebben az esetben a nevek ábécé sorrendben jelennek meg.
import java.util.Set;
import java.util.TreeSet;
public class TreeSetTest {
public static void main(String[] args) {
Set mySet = new TreeSet<>();
mySet.add("Stuart");
mySet.add("Alex");
mySet.add("Johnny");
mySet.add("Igor");
mySet.add("Bel");
System.out.println(mySet);
}
A kimenet a következő:
Rövid következtetések
-
A Java Set felület a Java Collections Framework része.
-
Megvalósított osztályok: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .
-
A legnépszerűbb készletmegvalósítások a HashSet , a LinkedHashSet és a TreeSet .
-
A HashSet elemek sorrendjét egy összetett algoritmus határozza meg. Ha fontos a tárolási sorrend, használjon TreeSet tárolót, amely az objektumokat növekvő sorrendben, összehasonlítási sorrendben tárolja, vagy egy LinkedHashSetet , amely az elemeket összeadási sorrendben tárolja.
-
Leggyakrabban készleteket használnak a tagság tesztelésére. Vagyis annak ellenőrzésére, hogy egy objektum matematikai értelemben egy adott halmazhoz tartozik-e. Tehát a gyakorlatban a Set- megvalósítások közül leggyakrabban a HashSet-et választják. Ez a megvalósítás a gyors keresésre van optimalizálva.
-
Egy halmazhoz nem adható duplikált elemek, ezért a Set felület implementációit használhatja egyedi elemek tárolására.
-
A Set lehetővé teszi, hogy csak egy null elemet adjon hozzá.
-
A készlet nem lista, és nem támogatja az indexeket vagy az elemek pozícióit.
GO TO FULL VERSION