Dowolna grupa pojedynczych obiektów reprezentowana jako pojedyncza jednostka nazywana jest kolekcją obiektów Java. W Javie istnieje oddzielny framework o nazwie Ramy kolekcji został zdefiniowany w JDK 1.2, który zawiera wszystkie zawarte w nim klasy i interfejsy kolekcji Java.
W Javie interfejs kolekcji ( Kolekcja java.util ) i interfejs mapy ( Java.util.Map ) to dwa główne interfejsy główne klas kolekcji Java.
Czego powinieneś się nauczyć w kolekcjach Java?
- Interfejs listy
- Klasa listy abstrakcyjnej
- Klasa abstrakcyjnej listy sekwencyjnej
- Lista tablic
- Klasa wektorowa
- Klasa stosu
- Klasa LinkedList
- Interfejs kolejki
- Blokowanie interfejsu kolejki
- Klasa abstrakcyjna kolejki
- Klasa PriorityQueue
- Klasa PriorityBlockingQueue
- Klasa ConcurrentLinkedQueue
- Klasa ArrayBlockingQueue
- Klasa DelayQueue
- Klasa LinkedBlockingQueue
- Połączona kolejka transferów
- I interfejs
- Interfejs BlockingDeque
- Klasa ConcurrentLinkedDeque
- Klasa ArrayDeque
- Ustaw interfejs
- Klasa zestawu abstrakcyjnego
- Klasa CopyOnWriteArraySet
- Klasa EnumSet
- Klasa ConcurrentHashMap
- Klasa HashSet
- Klasa LinkedHashSet
- Interfejs SortedSet
- Interfejs zestawu nawigacyjnego
- Zestaw drzew
- Klasa ConcurrentSkipListSet
- Interfejs mapy
- Interfejs SortedMap
- Interfejs mapy nawigacyjnej
- Interfejs ConcurrentMap
- Klasa TreeMap
- Klasa AbstractMap
- Klasa ConcurrentHashMap
- Klasa EnumMap
- Klasa HashMap
- Klasa IdentityHashMap
- Klasa LinkedHashMap
- Klasa HashTable
- Klasa właściwości
- Inne ważne koncepcje
- Jak przekonwertować HashMap na ArrayList
- Losowo wybierz elementy z listy
- Jak dodać wszystkie elementy z kolekcji do ArrayList
- Konwersja map Java na listę
- Konwersja tablicy na ArrayList
- Konwersja ArrayList na tablicę
- Różnice między Array i ArrayList
Co to jest framework w Javie?
Framework to zbiór klas i interfejsów, które zapewniają gotową architekturę. Aby zaimplementować nową funkcję lub klasę, nie ma potrzeby definiowania frameworka. Jednakże optymalny projekt obiektowy zawsze zawiera framework z kolekcją klas, tak aby wszystkie klasy wykonywały ten sam rodzaj zadań.
Potrzeba struktury oddzielnej kolekcji w Javie
Przed wprowadzeniem Collection Framework (lub przed JDK 1.2) standardowe metody grupowania obiektów Java (lub kolekcji) były Tablice Lub Wektory , Lub Tabele mieszające . Wszystkie te kolekcje nie miały wspólnego interfejsu. Dlatego też, choć główny cel wszystkich kolekcji jest ten sam, realizacja wszystkich tych kolekcji została zdefiniowana niezależnie i nie miała między nimi żadnej korelacji. Ponadto użytkownikom bardzo trudno jest zapamiętać wszystkie różnice metody , składnia i konstruktorzy obecny w każdej klasie kolekcji.
Rozumiemy to na przykładzie dodania elementu w tablicy mieszającej i wektorze.
tablica obiektów w Javie
Przykład:
Jawa
// Java program to demonstrate> // why collection framework was needed> import> java.io.*;> import> java.util.*;> class> CollectionDemo {> > public> static> void> main(String[] args)> > {> > // Creating instances of the array,> > // vector and hashtable> > int> arr[] => new> int> [] {> 1> ,> 2> ,> 3> ,> 4> };> > Vector v => new> Vector();> > Hashtable h => new> Hashtable();> > // Adding the elements into the> > // vector> > v.addElement(> 1> );> > v.addElement(> 2> );> > // Adding the element into the> > // hashtable> > h.put(> 1> ,> 'geeks'> );> > h.put(> 2> ,> '4geeks'> );> > // Array instance creation requires [],> > // while Vector and hastable require ()> > // Vector element insertion requires addElement(),> > // but hashtable element insertion requires put()> > // Accessing the first element of the> > // array, vector and hashtable> > System.out.println(arr[> 0> ]);> > System.out.println(v.elementAt(> 0> ));> > System.out.println(h.get(> 1> ));> > // Array elements are accessed using [],> > // vector elements using elementAt()> > // and hashtable elements using get()> > }> }> |
>
>Wyjście
1 1 geeks>
Jak możemy zaobserwować, żadna z tych kolekcji (Array, Vector czy Hashtable) nie implementuje standardowego interfejsu dostępu do składowych, programistom było bardzo trudno napisać algorytmy, które będą działać dla wszystkich rodzajów kolekcji. Kolejną wadą jest to, że większość metod „Vector” jest ostateczna, co oznacza, że nie możemy rozszerzyć klasy „Vector”, aby zaimplementować podobny rodzaj kolekcji. Dlatego programiści Java postanowili opracować wspólny interfejs, aby poradzić sobie z wyżej wymienionymi problemami i wprowadzili Framework zbierania w poście JDK 1.2, w którym zarówno starsze wektory, jak i tablice hashtable zostały zmodyfikowane, aby były zgodne z frameworkiem zbierania.
Zalety środowiska zbierania Java
Ponieważ brak struktury gromadzenia danych spowodował powyższy zestaw wad, poniżej przedstawiono zalety struktury gromadzenia danych.
- Spójne API: Interfejs API ma podstawowy zestaw interfejsów, takich jak Kolekcja , Ustawić , Lista , Lub Mapa , wszystkie klasy (ArrayList, LinkedList, Vector itp.), które implementują te interfejsy, mają Niektóre wspólny zestaw metod.
- Zmniejsza wysiłek programistyczny: Programista nie musi się martwić o projekt Kolekcji, ale może skupić się na jej najlepszym wykorzystaniu w swoim programie. Zatem podstawowa koncepcja programowania obiektowego (tj. abstrakcji) została pomyślnie wdrożona.
- Zwiększa szybkość i jakość programu: Zwiększa wydajność poprzez zapewnienie wysokowydajnych implementacji przydatnych struktur danych i algorytmów, ponieważ w tym przypadku programista nie musi myśleć o najlepszej implementacji określonej struktury danych. Może po prostu użyć najlepszej implementacji, aby drastycznie zwiększyć wydajność swojego algorytmu/programu.
Hierarchia frameworku zbierania w Javie
Pakiet narzędzi (java.util) zawiera wszystkie klasy i interfejsy wymagane przez strukturę kolekcji. Struktura kolekcji zawiera interfejs zwany interfejsem iterowalnym, który umożliwia iteratorowi iterację po wszystkich kolekcjach. Interfejs ten jest rozszerzony o główny interfejs kolekcji, który działa jako root dla struktury kolekcji. Wszystkie kolekcje rozszerzają ten interfejs kolekcji, rozszerzając w ten sposób właściwości iteratora i metody tego interfejsu. Poniższy rysunek ilustruje hierarchię struktury kolekcji.
Zanim zrozumiemy różne komponenty powyższego frameworku, przyjrzyjmy się najpierw klasie i interfejsowi.
- Klasa : Klasa to zdefiniowany przez użytkownika plan lub prototyp, na podstawie którego tworzone są obiekty. Reprezentuje zestaw właściwości lub metod wspólnych dla wszystkich obiektów jednego typu.
- Interfejs : Podobnie jak klasa, interfejs może mieć metody i zmienne, ale metody zadeklarowane w interfejsie są domyślnie abstrakcyjne (tylko sygnatura metody, nikt). Interfejsy określają, co klasa musi zrobić, a nie jak. To jest plan zajęć.
Metody interfejsu zbierania
Interfejs ten zawiera różne metody, które mogą być bezpośrednio używane przez wszystkie kolekcje implementujące ten interfejs. Oni są:
metoda | Opis |
---|---|
dodaj (obiekt) | Ta metoda służy do dodania obiektu do kolekcji. |
addAll(kolekcja c) | Ta metoda dodaje do tej kolekcji wszystkie elementy z danej kolekcji. |
jasne() | Ta metoda usuwa wszystkie elementy z tej kolekcji. |
zawiera (obiekt o) | Ta metoda zwraca wartość true, jeśli kolekcja zawiera określony element. |
zawieraWszystko (kolekcja c) | Ta metoda zwraca wartość true, jeśli kolekcja zawiera wszystkie elementy z danej kolekcji. |
równa się (obiekt o) | Ta metoda porównuje określony obiekt z tą kolekcją pod kątem równości. |
hashCode() | Ta metoda służy do zwracania wartości kodu skrótu dla tej kolekcji. |
jest pusty() | Ta metoda zwraca wartość true, jeśli ta kolekcja nie zawiera żadnych elementów. |
iterator() | Ta metoda zwraca iterator po elementach w tej kolekcji. |
maks.() | Ta metoda służy do zwracania maksymalnej wartości występującej w kolekcji. |
strumień równoległy() | Ta metoda zwraca równoległy Stream z tą kolekcją jako źródłem. |
usuń(obiekt o) | Metoda ta służy do usunięcia danego obiektu z kolekcji. Jeśli występują zduplikowane wartości, ta metoda usuwa pierwsze wystąpienie obiektu. |
usuń wszystko (kolekcja c) | Metoda ta służy do usunięcia ze zbioru wszystkich obiektów wymienionych w danej kolekcji. |
usuńIf(filtr predykatu) | Metoda ta służy do usunięcia wszystkich elementów tej kolekcji, które spełniają podane orzec . |
zachowaj wszystko (kolekcja c) | Ta metoda służy do zachowania tylko elementów w tej kolekcji, które znajdują się w określonej kolekcji. |
rozmiar() | Ta metoda służy do zwracania liczby elementów w kolekcji. |
rozdzielacz() | Ta metoda służy do tworzenia Rozdzielacz nad elementami z tej kolekcji. |
strumień() | Ta metoda służy do zwracania sekwencyjnego strumienia z tą kolekcją jako źródłem. |
do tablicy() | Ta metoda służy do zwracania tablicy zawierającej wszystkie elementy w tej kolekcji. |
Interfejsy rozszerzające interfejs kolekcji Java
Struktura kolekcji zawiera wiele interfejsów, z których każdy służy do przechowywania określonego typu danych. Poniżej przedstawiono interfejsy obecne w frameworku.
1. Iterowalny interfejs
Jest to interfejs główny dla całego środowiska kolekcji. Interfejs kolekcji rozszerza iterowalny interfejs. Dlatego z natury wszystkie interfejsy i klasy implementują ten interfejs. Główną funkcjonalnością tego interfejsu jest udostępnienie iteratora dla kolekcji. Dlatego ten interfejs zawiera tylko jedną metodę abstrakcyjną, którą jest iterator. Zwraca
Iterator iterator();>
2. Interfejs kolekcji
Interfejs ten rozszerza iterowalny interfejs i jest implementowany przez wszystkie klasy w strukturze kolekcji. Ten interfejs zawiera wszystkie podstawowe metody, które ma każda kolekcja, takie jak dodawanie danych do kolekcji, usuwanie danych, czyszczenie danych itp. Wszystkie te metody są zaimplementowane w tym interfejsie, ponieważ metody te są implementowane przez wszystkie klasy niezależnie od ich stylu wdrożenia. Ponadto umieszczenie tych metod w tym interfejsie gwarantuje, że nazwy metod będą uniwersalne dla wszystkich kolekcji. Dlatego w skrócie możemy powiedzieć, że ten interfejs buduje fundament, na którym implementowane są klasy kolekcji.
3. Interfejs listy
Jest to interfejs podrzędny interfejsu kolekcji. Interfejs ten przeznaczony jest dla danych typu lista, w której możemy przechowywać wszystkie uporządkowane zbiory obiektów. Pozwala to również na obecność w nim zduplikowanych danych. Ten interfejs listy jest implementowany przez różne klasy, takie jak ArrayList, Vector, Stack itp. Ponieważ wszystkie podklasy implementują listę, możemy utworzyć instancję obiektu listy za pomocą dowolnej z tych klas.
Na przykład:
List al = new ArrayList (); List ll = new LinkedList (); List v = new Vector (); Where T is the type of the object>
Klasy implementujące interfejs List są następujące:
I). Lista tablic
ArrayList zapewnia nam dynamiczne tablice w Javie. Chociaż może być wolniejszy niż standardowe tablice, ale może być pomocny w programach, w których potrzebne jest wiele manipulacji tablicą. Rozmiar ArrayList jest zwiększany automatycznie, jeśli kolekcja rośnie lub zmniejsza się, jeśli obiekty zostaną usunięte z kolekcji. Java ArrayList pozwala nam na losowy dostęp do listy. Nie można używać ArrayList klasa opakowania dla takich przypadków.
Przyjrzyjmy się ArrayList na następującym przykładzie:
Jawa
// Java program to demonstrate the> // working of ArrayList> import> java.io.*;> import> java.util.*;> class> GFG {> > // Main Method> > public> static> void> main(String[] args)> > {> > // Declaring the ArrayList with> > // initial size n> > ArrayList al => new> ArrayList();> > // Appending new elements at> > // the end of the list> > for> (> int> i => 1> ; i <=> 5> ; i++)> > al.add(i);> > // Printing elements> > System.out.println(al);> > // Remove element at index 3> > al.remove(> 3> );> > // Displaying the ArrayList> > // after deletion> > System.out.println(al);> > // Printing elements one by one> > for> (> int> i => 0> ; i System.out.print(al.get(i) + ' '); } }> |
>
>Wyjście
[1, 2, 3, 4, 5] [1, 2, 3, 5] 1 2 3 5>
II). Połączona lista
Klasa LinkedList jest implementacją klasy Przyjrzyjmy się LinkedList na następującym przykładzie:
Jawa
// Java program to demonstrate the> // working of LinkedList> import> java.io.*;> import> java.util.*;> class> GFG {> > // Main Method> > public> static> void> main(String[] args)> > {> > // Declaring the LinkedList> > LinkedList ll => new> LinkedList();> > // Appending new elements at> > // the end of the list> > for> (> int> i => 1> ; i <=> 5> ; i++)> > ll.add(i);> > // Printing elements> > System.out.println(ll);> > // Remove element at index 3> > ll.remove(> 3> );> > // Displaying the List> > // after deletion> > System.out.println(ll);> > // Printing elements one by one> > for> (> int> i => 0> ; i System.out.print(ll.get(i) + ' '); } }> |
>
>Wyjście
[1, 2, 3, 4, 5] [1, 2, 3, 5] 1 2 3 5>
iii). Wektor
Wektor zapewnia nam dynamiczne tablice w Javie. Chociaż może być wolniejszy niż standardowe tablice, ale może być pomocny w programach, w których potrzebne jest wiele manipulacji tablicą. Jest to identyczne z ArrayList pod względem implementacji. Jednak podstawowa różnica między wektorem a ArrayList polega na tym, że Vector jest zsynchronizowany, a ArrayList niezsynchronizowany.
Rozumiemy Vector na przykładzie:
Jawa
// Java program to demonstrate the> // working of Vector> import> java.io.*;> import> java.util.*;> class> GFG {> > // Main Method> > public> static> void> main(String[] args)> > {> > // Declaring the Vector> > Vector v => new> Vector();> > // Appending new elements at> > // the end of the list> > for> (> int> i => 1> ; i <=> 5> ; i++)> > v.add(i);> > // Printing elements> > System.out.println(v);> > // Remove element at index 3> > v.remove(> 3> );> > // Displaying the Vector> > // after deletion> > System.out.println(v);> > // Printing elements one by one> > for> (> int> i => 0> ; i System.out.print(v.get(i) + ' '); } }> |
>
>Wyjście
[1, 2, 3, 4, 5] [1, 2, 3, 5] 1 2 3 5>
IV). Stos
Układa modele klas i implementujeostatni na wejściu, pierwszy na wyjściu. Oprócz podstawowych operacji push i pop, klasa udostępnia trzy dodatkowe funkcje: pusty, wyszukiwanie i podgląd. Klasę tę można również nazwać podklasą wektora.
Przyjrzyjmy się stosowi na przykładzie:
Jawa
// Java program to demonstrate the> // working of a stack> import> java.util.*;> public> class> GFG {> > // Main Method> > public> static> void> main(String args[])> > {> > Stack stack => new> Stack();> > stack.push(> 'Geeks'> );> > stack.push(> 'For'> );> > stack.push(> 'Geeks'> );> > stack.push(> 'Geeks'> );> > // Iterator for the stack> > Iterator itr = stack.iterator();> > // Printing the stack> > while> (itr.hasNext()) {> > System.out.print(itr.next() +> ' '> );> > }> > System.out.println();> > stack.pop();> > // Iterator for the stack> > itr = stack.iterator();> > // Printing the stack> > while> (itr.hasNext()) {> > System.out.print(itr.next() +> ' '> );> > }> > }> }> |
>
>Wyjście
Geeks For Geeks Geeks Geeks For Geeks>
Notatka: Stack jest podklasą Vector i starszą klasą. Jest bezpieczny dla wątków i może znajdować się nad głową w środowisku, w którym bezpieczeństwo wątków nie jest potrzebne. Alternatywą dla Stack jest użycie Tablica Usuń z kolejki który nie jest bezpieczny dla wątków i ma szybszą implementację tablicy.
4. Interfejs kolejki
Jak sama nazwa wskazuje, interfejs kolejki utrzymuje kolejność FIFO (pierwsze weszło, pierwsze wyszło) podobną do linii kolejki w świecie rzeczywistym. Interfejs ten przeznaczony jest do przechowywania wszystkich elementów, w których liczy się kolejność elementów. Na przykład za każdym razem, gdy próbujemy zarezerwować bilet, bilety są sprzedawane na zasadzie „kto pierwszy, ten lepszy”. Bilet otrzymuje zatem osoba, której wniosek trafi jako pierwszy do kolejki. Istnieją różne klasy, np Kolejka priorytetowa , TablicaDeque itp. Ponieważ wszystkie te podklasy implementują kolejkę, możemy utworzyć instancję obiektu kolejki za pomocą dowolnej z tych klas.
Na przykład:
Queue pq = new PriorityQueue (); Queue ad = new ArrayDeque (); Where T is the type of the object.>
Najczęściej używaną implementacją interfejsu kolejki jest PriorityQueue.
Kolejka priorytetowa
PriorityQueue jest używany, gdy obiekty mają być przetwarzane na podstawie priorytetu. Wiadomo, że kolejka działa zgodnie z algorytmem „pierwszy na wejściu, pierwszy na wyjściu”, ale czasami elementy kolejki muszą zostać przetworzone zgodnie z priorytetem i w takich przypadkach używana jest ta klasa. PriorityQueue opiera się na stercie priorytetów. Elementy kolejki priorytetowej uporządkowane są według porządku naturalnego, czyli a Komparator podawane w czasie konstruowania kolejki, w zależności od użytego konstruktora.
Zrozummy kolejkę priorytetową na przykładzie:
Jawa
// Java program to demonstrate the working of> // priority queue in Java> import> java.util.*;> class> GfG {> > // Main Method> > public> static> void> main(String args[])> > {> > // Creating empty priority queue> > PriorityQueue pQueue> > => new> PriorityQueue();> > // Adding items to the pQueue using add()> > pQueue.add(> 10> );> > pQueue.add(> 20> );> > pQueue.add(> 15> );> > // Printing the top element of PriorityQueue> > System.out.println(pQueue.peek());> > // Printing the top element and removing it> > // from the PriorityQueue container> > System.out.println(pQueue.poll());> > // Printing the top element again> > System.out.println(pQueue.peek());> > }> }> |
>
>Wyjście
10 10 15>
5. I interfejs
Jest to bardzo niewielka odmiana Na przykład:
Deque ad = new ArrayDeque (); Where T is the type of the object.>
Klasą implementującą interfejs deque jest ArrayDeque.
TablicaDeque
Klasa ArrayDeque zaimplementowana w frameworku kolekcji umożliwia nam zastosowanie tablicy o zmiennym rozmiarze. Jest to specjalny rodzaj tablicy, która rośnie i pozwala użytkownikom dodawać lub usuwać elementy po obu stronach kolejki. Deque tablic nie mają żadnych ograniczeń pojemności i rosną w miarę potrzeb, aby wspierać wykorzystanie.
Rozumiemy ArrayDeque na przykładzie:
Jawa
// Java program to demonstrate the> // ArrayDeque class in Java> import> java.util.*;> public> class> ArrayDequeDemo {> > public> static> void> main(String[] args)> > {> > // Initializing an deque> > ArrayDeque de_que> > => new> ArrayDeque(> 10> );> > // add() method to insert> > de_que.add(> 10> );> > de_que.add(> 20> );> > de_que.add(> 30> );> > de_que.add(> 40> );> > de_que.add(> 50> );> > System.out.println(de_que);> > // clear() method> > de_que.clear();> > // addFirst() method to insert the> > // elements at the head> > de_que.addFirst(> 564> );> > de_que.addFirst(> 291> );> > // addLast() method to insert the> > // elements at the tail> > de_que.addLast(> 24> );> > de_que.addLast(> 14> );> > System.out.println(de_que);> > }> }> |
>
>Wyjście
[10, 20, 30, 40, 50] [291, 564, 24, 14]>
6. Ustaw interfejs
Zbiór to nieuporządkowana kolekcja obiektów, w której nie można przechowywać zduplikowanych wartości. Tej kolekcji używamy, gdy chcemy uniknąć powielania obiektów i chcemy przechowywać tylko unikalne obiekty. Ten interfejs zestawu jest implementowany przez różne klasy, takie jak HashSet, TreeSet, LinkedHashSet itp. Ponieważ wszystkie podklasy implementują zestaw, możemy utworzyć instancję obiektu zestawu za pomocą dowolnej z tych klas.
Na przykład:
Set hs = new HashSet (); Set lhs = new LinkedHashSet (); Set ts = new TreeSet (); Where T is the type of the object.>
Poniżej znajdują się klasy implementujące interfejs Set:
I). Zestaw skrótów
Klasa HashSet jest nieodłączną implementacją struktury danych tabeli skrótów. Obiekty, które wstawiamy do HashSet, nie gwarantują, że zostaną wstawione w tej samej kolejności. Obiekty są wstawiane na podstawie ich kodu skrótu. Ta klasa umożliwia również wstawianie elementów NULL. Rozumiemy HashSet na przykładzie:
Jawa
// Java program to demonstrate the> // working of a HashSet> import> java.util.*;> public> class> HashSetDemo {> > // Main Method> > public> static> void> main(String args[])> > {> > // Creating HashSet and> > // adding elements> > HashSet hs => new> HashSet();> > hs.add(> 'Geeks'> );> > hs.add(> 'For'> );> > hs.add(> 'Geeks'> );> > hs.add(> 'Is'> );> > hs.add(> 'Very helpful'> );> > // Traversing elements> > Iterator itr = hs.iterator();> > while> (itr.hasNext()) {> > System.out.println(itr.next());> > }> > }> }> |
>
>Wyjście
Very helpful Geeks For Is>
II). Połączony zestaw Hash
LinkedHashSet jest bardzo podobny do HashSet. Różnica polega na tym, że do przechowywania danych wykorzystuje się podwójnie połączoną listę i zachowuje się kolejność elementów.
Przyjrzyjmy się LinkedHashSet na przykładzie:
Jawa
// Java program to demonstrate the> // working of a LinkedHashSet> import> java.util.*;> public> class> LinkedHashSetDemo {> > // Main Method> > public> static> void> main(String args[])> > {> > // Creating LinkedHashSet and> > // adding elements> > LinkedHashSet lhs> > => new> LinkedHashSet();> > lhs.add(> 'Geeks'> );> > lhs.add(> 'For'> );> > lhs.add(> 'Geeks'> );> > lhs.add(> 'Is'> );> > lhs.add(> 'Very helpful'> );> > // Traversing elements> > Iterator itr = lhs.iterator();> > while> (itr.hasNext()) {> > System.out.println(itr.next());> > }> > }> }> |
>
>Wyjście
Geeks For Is Very helpful>
7. Interfejs zestawu posortowanego
Interfejs ten jest bardzo podobny do interfejsu zestawu. Jedyna różnica polega na tym, że ten interfejs ma dodatkowe metody, które utrzymują kolejność elementów. Interfejs sortowanego zestawu rozszerza interfejs zestawu i służy do obsługi danych, które wymagają posortowania. Klasą implementującą ten interfejs jest TreeSet. Ponieważ ta klasa implementuje SortedSet, możemy utworzyć instancję obiektu SortedSet za pomocą tej klasy.
Na przykład:
SortedSet ts = new TreeSet (); Where T is the type of the object.>
Klasą implementującą interfejs sortowanego zestawu jest TreeSet.
Zestaw drzew
Klasa TreeSet używa drzewa do przechowywania. Porządek elementów jest utrzymywany przez zbiór przy użyciu ich naturalnego porządku, niezależnie od tego, czy zapewniony jest wyraźny komparator. Musi to być spójne z równością, jeśli ma poprawnie zaimplementować interfejs Set. Można go również zamówić za pomocą Komparatora udostępnianego w ustalonym czasie tworzenia, w zależności od użytego konstruktora.
Rozumiemy TreeSet na przykładzie:
Jawa
// Java program to demonstrate the> // working of a TreeSet> import> java.util.*;> public> class> TreeSetDemo {> > // Main Method> > public> static> void> main(String args[])> > {> > // Creating TreeSet and> > // adding elements> > TreeSet ts => new> TreeSet();> > ts.add(> 'Geeks'> );> > ts.add(> 'For'> );> > ts.add(> 'Geeks'> );> > ts.add(> 'Is'> );> > ts.add(> 'Very helpful'> );> > // Traversing elements> > Iterator itr = ts.iterator();> > while> (itr.hasNext()) {> > System.out.println(itr.next());> > }> > }> }> |
>
>Wyjście
For Geeks Is Very helpful>
8. Interfejs mapy
Mapa to struktura danych obsługująca parę klucz-wartość do mapowania danych. Ten interfejs nie obsługuje duplikatów kluczy, ponieważ ten sam klucz nie może mieć wielu mapowań, jednakże pozwala na duplikowanie wartości w różnych kluczach. Mapa przydaje się, jeśli są dane i chcemy na podstawie klucza wykonać operacje. Ten interfejs mapy jest implementowany przez różne klasy, takie jak HashMapa , Mapa Drzewa itp. Ponieważ wszystkie podklasy implementują mapę, możemy utworzyć instancję obiektu mapy za pomocą dowolnej z tych klas.
Na przykład:
Map hm = new HashMap (); Map tm = new TreeMap (); Where T is the type of the object.>
Często używaną implementacją interfejsu Map jest HashMap.
HashMapa
HashMap zapewnia podstawową implementację interfejsu Map w Javie. Przechowuje dane w parach (klucz, wartość). Aby uzyskać dostęp do wartości w HashMap, musimy znać jej klucz. HashMap wykorzystuje technikę zwaną hashowaniem. Haszowanie to technika konwertowania dużego ciągu na mały ciąg reprezentujący ten sam ciąg, dzięki czemu operacje indeksowania i wyszukiwania są szybsze. HashSet używa również HashMap wewnętrznie.
Przyjrzyjmy się HashMapowi na przykładzie:
Jawa
// Java program to demonstrate the> // working of a HashMap> import> java.util.*;> public> class> HashMapDemo {> > // Main Method> > public> static> void> main(String args[])> > {> > // Creating HashMap and> > // adding elements> > HashMap hm> > => new> HashMap();> > hm.put(> 1> ,> 'Geeks'> );> > hm.put(> 2> ,> 'For'> );> > hm.put(> 3> ,> 'Geeks'> );> > // Finding the value for a key> > System.out.println(> 'Value for 1 is '> + hm.get(> 1> ));> > // Traversing through the HashMap> > for> (Map.Entry e : hm.entrySet())> > System.out.println(e.getKey() +> ' '> > + e.getValue());> > }> }> |
>
>Wyjście
Value for 1 is Geeks 1 Geeks 2 For 3 Geeks>