Co to jest zestaw Java
Set to interfejs z Java Collection Framework, ale Set nie jest kolekcją uporządkowaną, w przeciwieństwie do List . Oznacza to, że elementy zestawu Java Set są przechowywane bez określonej kolejności. Nie ma więc kontroli nad pozycją, w której można wstawić element. Ponadto nie można uzyskać dostępu do elementów według ich indeksu. Z matematycznego punktu widzenia zestaw to zbiór unikalnych elementów. W rzeczywistości jest to kolekcja nieuporządkowana (kolekcja nieuporządkowana), w której nie można przechowywać identycznych elementów. Jeśli celowo dodasz zduplikowany element do zestawu , ta akcja zostanie zignorowana, a zestaw się nie zmieni. Dopuszczalne jest jednak przechowywanie w nim jednego elementu zerowego.Ustaw implementacje
Java Set to interfejs, więc do tworzenia obiektów musisz użyć jednej z jego implementacji. Są to HashSet , TreeSet i LinkedHashSet . W Set s każdy element jest przechowywany tylko w jednej instancji, a różne implementacje Set używają innej kolejności przechowywania elementów. W HashSet kolejność elementów jest określana przez złożony algorytm. Jeśli kolejność przechowywania jest dla Ciebie ważna, użyj kontenera TreeSet , który przechowuje obiekty posortowane rosnąco w porządku porównawczym lub LinkedHashSet, który przechowuje elementy w kolejności dodawania. Zestawy są często używane do testowania przynależności, dzięki czemu można łatwo sprawdzić, czy obiekt należy do danego zestawu, więc w praktyce zwykle wybiera się implementację HashSet , która jest zoptymalizowana pod kątem szybkiego wyszukiwania. HashSet to kolekcja, która wykorzystuje swoje wartości hash zwracane przez metodę hashCode() do wewnętrznego przechowywania elementów. Oznacza to, że wewnątrz HashSet<E> przechowywany jest obiekt HashMap <E, Object> , który przechowuje wartości HashSet jako klucze. Korzystanie z kodów skrótu umożliwia szybkie wyszukiwanie, dodawanie i usuwanie elementów ze zbioru . LinkedHashSet to HashSetktóry przechowuje również elementy na połączonej liście. Normalny HashSet nie zachowuje kolejności elementów. Po pierwsze, oficjalnie po prostu nie istnieje, a po drugie, nawet porządek wewnętrzny może diametralnie się zmienić, gdy doda się tylko jeden element. I możesz pobrać iterator z LinkedHashSet i użyć go do przejrzenia wszystkich elementów w dokładnej kolejności, w jakiej zostały dodane do LinkedHashSet . Nie często, ale czasami może to być bardzo potrzebne. TreeSet to kolekcja, która przechowuje elementy jako drzewo uporządkowane według wartości. Wewnątrz TreeSet<E> znajduje się TreeMap<E, Object> , który przechowuje wszystkie te wartości. I ta mapa drzewaużywa czerwono-czarnego zrównoważonego drzewa binarnego do przechowywania elementów. Dlatego ma bardzo szybkie operacje add() , remove() , zawiera() .Utwórz ustawiony obiekt
Aby utworzyć Set Object, możesz użyć jednego z następujących formularzy:Set<Integer> intSet = new HashSet<>();
Set<String> vSet = new HashSet<>();
Set mySet = new LinkedHashSet();
HashSet<String> myHashset = new HashSet<>();
Oto prosty przykład, w którym tworzymy 2 Set s, HashSet i LinkedHashSet , i dodajemy do każdego z nich po 5 elementów. W tym celu możemy użyć metody add() .
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);
}
}
Oto wynik działania programu:
Metody zestawów Java
Oto niektóre z ważnych metod Java Set :-
boolean add(E e) . Dodaje określony element do zestawu, jeśli jeszcze go nie ma (operacja opcjonalna).
-
boolowskie usuń (Obiekt o) . Usuwa określony element z tego zestawu, jeśli jest obecny (operacja opcjonalna).
-
wartość logiczna usuń wszystko(kolekcja c) . Usuwa z tego zestawu wszystkie jego elementy, które są zawarte w określonej kolekcji (operacja opcjonalna).
-
wartość logiczna zachowaj wszystko (kolekcja c) . Zachowuje tylko te elementy z tego zestawu, które są zawarte w określonej kolekcji (operacja opcjonalna).
-
nieważne wyczyść() . Usuwa wszystkie elementy z zestawu.
-
Iterator iterator() . Zwraca iterator dla elementów w tym zestawie.
-
rozmiar int() . służy do uzyskania liczby elementów w zbiorze.
-
wartość logiczna isEmpty() . aby sprawdzić, czy zestaw jest pusty, czy nie.
-
wartość logiczna zawiera (Obiekt o) . Zwraca wartość true, jeśli ten zestaw zawiera określony element.
-
Iterator iterator() . Zwraca iterator dla elementów w tym zestawie. Elementy są zwracane w dowolnej kolejności.
-
Obiekt[] toArray() . Zwraca tablicę zawierającą wszystkie elementy w tym zestawie. Jeśli ten zestaw daje jakiekolwiek gwarancje, w jakiej kolejności jego elementy są zwracane przez iterator, ta metoda musi zwracać elementy w tej samej kolejności.
Przykład głównych operacji Java Set
W tym przykładzie tworzymy tablicę ciągów znaków, a następnie przekazujemy ją do mySet za pomocą operacji Arrays.asList . Następnie usuwamy jeszcze kilka elementów i dodajemy jeszcze kilka. W takim przypadku jeden z elementów zestawu już istnieje: nie zostanie dodany. Wypróbujemy również operacje sprawdzenia pustki isEmpty() , określenia wielkości zestawu size() oraz wyczyszczenia zbioru ze wszystkich elementów clear() .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());
}
}
Wyjście programu jest tutaj:
Przykład z LinkedHashSet i ustawionym na Array
Napiszmy inny program. W nim utworzymy zestaw na podstawie LinkedHashSet , dodamy do niego elementy, a następnie przekonwertujemy zestaw na tablicę.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]);
}
}
Oto wynik działania programu:
Ustaw przykład za pomocą iteratora
Stwórzmy zbiór, następnie wydrukujmy go za pomocą iteratora, a następnie usuńmy z niego wszystkie liczby parzyste, również za pomocą iteratora.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);
}
}
Wyjście programu jest tutaj:
Przykład z TreeSet
Jeśli sortowanie jest dla Ciebie ważne, użyj implementacji TreeSet . W tym krótkim przykładzie uzupełnimy zestaw imionami przyjaciół, tak jak w poprzednich przykładach. Jednak w posortowanym TreeSet elementy zostaną natychmiast zapisane w posortowanej kolejności. W takim przypadku nazwy będą wyświetlane alfabetycznie.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);
}
Dane wyjściowe to:
Krótkie wnioski
-
Interfejs Java Set jest częścią środowiska Java Collections Framework.
-
Zaimplementowane klasy: AbstractSet , ConcurrentHashMap.KeySetView , ConcurrentSkipListSet , CopyOnWriteArraySet , EnumSet , HashSet , JobStateReasons , LinkedHashSet , TreeSet .
-
Najpopularniejsze implementacje Set to HashSet , LinkedHashSet i TreeSet .
-
Kolejność elementów HashSet jest określana przez złożony algorytm. Jeśli kolejność przechowywania jest dla Ciebie ważna, użyj kontenera TreeSet , który przechowuje obiekty posortowane rosnąco w kolejności porównania, lub LinkedHashSet , który przechowuje elementy w kolejności dodawania.
-
Najczęściej zestawy służą do testowania członkostwa. Czyli sprawdzić, czy obiekt należy do danego zbioru w sensie matematycznym. Tak więc najczęściej ze wszystkich implementacji Set w praktyce, zwykle wybierany jest HashSet . Ta implementacja jest zoptymalizowana pod kątem szybkiego wyszukiwania.
-
Nie możesz dodawać zduplikowanych elementów do zestawu, więc możesz użyć implementacji interfejsu Set do przechowywania unikalnych elementów.
-
Zestaw umożliwia dodanie tylko jednego elementu zerowego.
-
Zestaw nie jest listą i nie obsługuje indeksów ani pozycji jego elementów.
GO TO FULL VERSION