• Nie Znaleziono Wyników

Interfejs List

N/A
N/A
Protected

Academic year: 2021

Share "Interfejs List"

Copied!
24
0
0

Pełen tekst

(1)

Kolekcje

Monika Wrzosek (IM UG) Programowanie obiektowe 208 / 231

(2)

Kolekcje

W programach zachodzi potrzeba przechowywania w pamięci nieznanej z góry liczby elementów. Możliwość taką dostarczają kolekcje

Java Collections Framework (JCF)

zbiory, listy, kolejki (set, list, queue) - kolekcje, których elementy podlegają ściśle określonym regułom (np. elementy zbioru nie mogą się powtarzać), odwzorowania (map) - kolekcje przechowujące pary klucz-wartość ; można je traktować jako tablice, których elementami są zmienne typu wartość, zaś indeksowane są przez zmienne typu klucz.

Do przechodzenia przez elementy kontenera można również stosować iteratory. Są one obiektami, które mogą pracować na dowolnym kontenerze.

(3)

Monika Wrzosek (IM UG) Programowanie obiektowe 210 / 231

(4)
(5)

Interfejs Collection

Interfejs Collection<Typ> posiada m.in. następujące metody.

boolean add(Typ o)

– umieszcza obiekt o w kolekcji, zwraca true, jeśli kolekcja uległa zmianie w wyniku tej operacji,

boolean addAll(Collection<Typ> c)

– dodaje do kolekcji wszystkie elementy z kolekcji c, zwraca true, jeśli kolekcja uległa zmianie w wyniku tej operacji,

void clear()

– usuwa wszystkie elementy z kolekcji, boolean contains(Typ o)

– zwraca true jeśli element o jest w kolekcji, boolean containsAll(Collection<Typ> c)

– zwraca true jeśli wszystkie elementy z kolekcji c jest w kolekcji, boolean isEmpty()

– zwraca true jeśli kolekcja jest pusta,

Monika Wrzosek (IM UG) Programowanie obiektowe 212 / 231

(6)

Interfejs Collection

boolean remove(Typ o)

– sprawdza, czy element o jest w kolekcji, jeśli tak – usuwa go (lub jeden z nich, jeśli jest więcej), zwraca true jeśli udało się usunąć,

boolean removeAll(Collection<Typ> c)

– usuwa z kontenera wszystkie elementy znajdujące się w kontenerze c (różnica zbiorów), zwraca true jeśli usunął chociaż jeden element, boolean retainAll(Collection<Typ> c)

– usuwa z kontenera wszystkie elementy nie znajdujące się w kontenerze c (część wspólna zbiorów), zwraca true jeśli usunął chociaż jeden element, int size()

– zwraca ilość elementów przechowywanych w kontenerze, Typ[] toArray()

– zwraca elementy przechowywane w kontenerze w postaci tablicy, Iterator<Typ> iterator()

– zwraca iterator do poruszania się po kolekcji.

Oczywiście wszystkie te metody są w interfejsie jedynie zadeklarowane. Ich realizacja należy do konkretnych klas implementujących ten interfejs.

(7)

Interfejs List

Interfejs List jest rozszerzeniem interfejsu Collection. Deklaruje on dodatkowo m.in. następujące metody (dla interfejsu sparametryzowanego List<Typ>):

void add(int indeks, Typ o)

– dodaje obiekt o do listy na pozycji indeks, Typ get(int indeks)

– zwraca element znajdujący się w liście na pozycji indeks, int indexOf(Typ o)

– zwraca indeks pierwszego wystąpienia na liście obiektu o, -1 jeśli taki obiekt nie występuje,

int lastIndexOf(Typ o)

– zwraca indeks ostatniego wystąpienia na liście obiektu o, -1 jeśli taki obiekt nie występuje,

Typ remove(int indeks)

– usuwa z listy element znajdujący się na pozycji indeks a następnie go zwraca,

Monika Wrzosek (IM UG) Programowanie obiektowe 214 / 231

(8)

Interfejs List

Object set(int indeks, Typ o)

– zastępuje element znajdujący się na pozycji indeks obiektem o, zwraca zastąpiony obiekt (starą wartość z pozycji indeks),

List<Typ> subList(int pocz, int kon)

– zwraca listę utworzoną z elementów listy wyjściowej o indeksach od pocz do kon - 1, a w przeciwnym wypadku listę pustą (gdy pocz=kon) lub wyjątek IndexOutOfBoundsException,

ListIterator<Typ> listIterator()

– zwraca iterator umożliwiający poruszanie się po liście.

(9)

Klasa ArrayList

Klasa ArrayList jest implementacją interfejsu List w oparciu o tablicę, której rozmiar jest w razie potrzeby zwiększany. Dzięki temu dostęp do elementów jest szybki, ale dodawanie i usuwanie elementów w innym miejscu niż na końcu jest wolne.

i m p o r t j a v a . u t i l . ∗ ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r a n d = new Random ( ) ;

L i s t <I n t e g e r > l i s t a = new A r r a y L i s t < >();

// d o d a w a n i e e l e m e n t ów do l i s t y f o r(i n t x =0; x <10; x++)

l i s t a . add ( x ) ;

S y s t e m . o u t . p r i n t l n ( l i s t a ) ;

// c z y s z c z e n i e l i s t y i d o d a n i e i n n y c h e l e m e n t ów l i s t a . c l e a r ( ) ;

f o r(i n t x =0; x <10; x++)

l i s t a . add ( r a n d . n e x t I n t ( 1 0 0 ) ) ; S y s t e m . o u t . p r i n t l n ( l i s t a ) ; }

}

[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]

[ 3 , 3 0 , 3 2 , 5 7 , 4 3 , 4 4 , 7 4 , 8 , 6 , 8 5 ]

Monika Wrzosek (IM UG) Programowanie obiektowe 216 / 231

(10)

Klasa LinkedList

Klasa LinkedList również, tak jak ArrayList, implementuje podstawowy interfejs List jak i Queue. Dostęp do poszczególnych elementów listy jest tu wolniejszy, ale za to operacje wstawiania i usuwania elementów z dowolnego miejsca są szybsze (zwłaszcza na początku i na końcu). Jest za to mniej wydajna w realizacji swobodnego dostępu do elementów listy.

Klasa LinkedList<Typ> posiada dodatkowo m.in. metody:

void addFirst(Typ o)– dodaje element na początek listy, void addLast(Typ o)– dodaje element na koniec listy, Typ getFirst()– zwraca pierwszy element listy, Typ getLast()– zwraca ostatni element listy,

Typ removeFirst()– usuwa pierwszy element listy, a następnie go zwraca, Typ removeLast()– usuwa ostatni element listy, a następnie go zwraca.

Te metody pozwalają na wykorzystanie jej w roli stosu, kolejki albo kolejki dwukierunkowej.

(11)

Klasa LinkedList

i m p o r t j a v a . u t i l . ∗ ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r a n d = new Random ( ) ;

L i s t <I n t e g e r > l i s t a = new L i n k e d L i s t < >();

// d o d a w a n i e e l e m e n t ów do l i s t y f o r(i n t x =0; x <10; x++)

l i s t a . add ( x ) ;

S y s t e m . o u t . p r i n t l n ( l i s t a ) ;

// c z y s z c z e n i e l i s t y i d o d a n i e i n n y c h e l e m e n t ów l i s t a . c l e a r ( ) ;

f o r(i n t x =0; x <10; x++)

l i s t a . add ( r a n d . n e x t I n t ( 1 0 0 ) ) ; S y s t e m . o u t . p r i n t l n ( l i s t a ) ; }

}

[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ]

[ 3 9 , 8 3 , 7 7 , 5 8 , 6 6 , 5 9 , 7 3 , 3 0 , 7 2 , 8 ]

Monika Wrzosek (IM UG) Programowanie obiektowe 218 / 231

(12)

Interfejs Set

Kolekcje implementujące interfejs Set (czyli zbiory) służą do przechowywania niepowtarzających się elementów. W stosunku do interfejsu Collection interfejs Set nie implementuje żadnych nowych metod.

Istnieją dwie klasyczne implementacje interfejsu Set:

HashSet – implementacja w oparciu o tablicę haszową, umożliwia bardzo szybkie zlokalizowanie elementu nawet w dużym zbiorze, obiekty

przechowywane w tym zbiorze powinny implementować funkcję hashCode() z klasy Object,

TreeSet – implementacja na bazie drzewa, zapewnia uporządkowanie elementów w zbiorze.

Otrzymujemy również klasę LinkedHashSet dziedziczącą z HashSet. Ten Set na zewnątrz prezentuje porządek zgodny z kolejnością wstawiania, udając

najzwyklejszą listę.

(13)

i m p o r t j a v a . u t i l . ∗ ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r a n d = new Random ( ) ;

S e t <I n t e g e r > s e t 1 = new H a s h S e t ( ) ;

S e t <I n t e g e r > s e t 2 = new L i n k e d H a s h S e t < >();

S e t <I n t e g e r > s e t 3 = new T r e e S e t < >();

f o r(i n t x =0; x <20; x++) { i n t v a r = r a n d . n e x t I n t ( 3 0 ) ; s e t 1 . add ( v a r ) ;

s e t 2 . add ( v a r ) ; s e t 3 . add ( v a r ) ; }

S y s t e m . o u t . p r i n t l n (" H a s h S e t : \ n " + s e t 1 ) ; S y s t e m . o u t . p r i n t l n (" L i n k e d H a s h S e t : \ n " + s e t 2 ) ; S y s t e m . o u t . p r i n t l n (" T r e e S e t : \ n " + s e t 3 ) ; }

}

H a s h S e t :

[ 0 , 5 , 7 , 1 0 , 1 1 , 1 2 , 1 4 , 1 5 , 1 7 , 2 0 , 2 1 , 2 2 , 2 3 , 2 8 ] L i n k e d H a s h S e t :

[ 1 5 , 1 1 , 1 7 , 1 0 , 2 8 , 7 , 2 0 , 5 , 2 3 , 1 2 , 0 , 2 1 , 2 2 , 1 4 ] T r e e S e t :

[ 0 , 5 , 7 , 1 0 , 1 1 , 1 2 , 1 4 , 1 5 , 1 7 , 2 0 , 2 1 , 2 2 , 2 3 , 2 8 ]

Monika Wrzosek (IM UG) Programowanie obiektowe 220 / 231

(14)

Interfejs Queue

Kolejka to kolekcja typu first-in, first-out (FIFO). Oznacza to, że elementy dodaje się na koniec, a pobiera z początku. Kolejki są zwykle wykorzystywane w roli pewnego mechanizmu transferu obiektów pomiędzy różnymi obszarami programu.

Są one szczególnie przydatne w programowaniu współbieżnym, ponieważ pozwalają bezpiecznie przekazywać obiekty pomiędzy zadaniami.

LinkedList zawiera metody odpowiadające zachowaniu kolejki i implementuje interfejs Queue, więc można go użyć w roli implementacji kolejki. Klasa LinkedList<Typ> posiada dodatkowo m.in. metody:

Typ element()– zwraca, ale nie usuwa, pierwszy element kolejki. Gdy kolejka jest pusta zwracany jest wyjątek NoSuchElementException,

void offer(Typ o)– dodaje element na koniec kolejki,

Typ peek()– zwraca, ale nie usuwa, pierwszy element kolejki. Gdy kolejka jest pusta zwracana jest wartość null,

Typ poll()– zwraca i usuwa pierwszy element kolejki. Gdy kolejka jest pusta zwracana jest wartość null,

Typ remove()– zwraca i usuwa pierwszy element kolejki. Gdy kolejka jest pusta zwracany jest wyjątek NoSuchElementException.

(15)

i m p o r t j a v a . u t i l . ∗ ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r a n d = new Random ( ) ;

Queue<I n t e g e r > k o l e j k a = new L i n k e d L i s t < >();

// d o d a w a n i e e l e m e n t ów do k o l e j k i f o r(i n t x =0; x <10; x++)

k o l e j k a . o f f e r ( x ) ;

S y s t e m . o u t . p r i n t l n ( k o l e j k a ) ;

// c z y s z c z e n i e k o l e j k i i wy ś w i e t l a n i e e l e m e n t ów i n t r o z m i a r = k o l e j k a . s i z e ( ) ;

f o r(i n t x =0; x<r o z m i a r ; x++)

S y s t e m . o u t . p r i n t ( k o l e j k a . p o l l ( ) + " ") ; // d o d a w a n i e nowych e l e m e n t ów

f o r(i n t x =0; x <10; x++)

k o l e j k a . o f f e r ( r a n d . n e x t I n t ( 1 0 0 ) ) ; S y s t e m . o u t . p r i n t l n (" \ n " + k o l e j k a ) ; }

}

[ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 ] 0 1 2 3 4 5 6 7 8 9

[ 2 0 , 5 9 , 3 9 , 6 2 , 5 2 , 7 5 , 6 4 , 4 , 5 9 , 3 6 ]

Monika Wrzosek (IM UG) Programowanie obiektowe 222 / 231

(16)

Klasa PriorityQueue

Klasa PriorityQueue (kolejka priorytetowa) przewiduje, że następnym elementem wydobytym z kolejki będzie element o najwyższym priorytecie.

Kiedy za pomocą metody offer() umieszczamy obiekt w tej kolejce, jest on wstawiany zgodnie z priorytetem. Domyślnie obiekty są układane według tak zwanego porządku naturalnego, który można zmieniać udostępniając własny komparator.

Kolejka priorytetowa zapewnia, że wywołanie peek(), pool() bądź remove() zwróci element o najwyższym priorytecie.

Typy wbudowane, takie jak Integer, String, Character są przystosowane do kolejki priorytetowej.

(17)

i m p o r t j a v a . u t i l . ∗ ; p u b l i c c l a s s Main {

p u b l i c s t a t i c S t r i n g l o s u j S t r i n g ( ) {

c h a r[ ] c h a r s = " a b c d e f g h i j k l m n o p q r s t u v w x y z ". t o C h a r A r r a y ( ) ; S t r i n g B u i l d e r s b = new S t r i n g B u i l d e r ( ) ;

Random random = new Random ( ) ; f o r (i n t i = 0 ; i < 5 ; i ++) {

c h a r c = c h a r s [ random . n e x t I n t ( c h a r s . l e n g t h ) ] ; s b . a p p e n d ( c ) ;

}

r e t u r n s b . t o S t r i n g ( ) ; }

// cd . na k o l e j n y m s l a j d z i e

Monika Wrzosek (IM UG) Programowanie obiektowe 224 / 231

(18)

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r a n d = new Random ( ) ;

Queue<I n t e g e r > k o l e j k a 1 = new P r i o r i t y Q u e u e < >();

Queue<S t r i n g > k o l e j k a 2 = new P r i o r i t y Q u e u e < >();

f o r(i n t x =0; x <10; x++) {

i n t v a r = r a n d . n e x t I n t ( 1 0 0 ) ; S y s t e m . o u t . p r i n t ( v a r + " ") ; k o l e j k a 1 . add ( v a r ) ;

}

S y s t e m . o u t . p r i n t l n (" \ n " + k o l e j k a 1 ) ; f o r(i n t x =0; x <10; x++)

{

S t r i n g v a r = l o s u j S t r i n g ( ) ; S y s t e m . o u t . p r i n t ( v a r + " ") ; k o l e j k a 2 . add ( v a r ) ;

}

S y s t e m . o u t . p r i n t l n (" \ n " + k o l e j k a 2 ) ; }

} // k o n i e c k l a s y Main

46 85 89 30 18 14 96 94 94 70

[ 1 4 , 3 0 , 1 8 , 8 5 , 4 6 , 8 9 , 9 6 , 9 4 , 9 4 , 7 0 ]

f l u b l l f a c d v i k y q p y x e r r i m t n o x e k u i d l w v g x u x n w d f q j n v u y s

[ f l u b l , gxuxn , i d l w v , l f a c d , n v u y s , v i k y q , o x e k u , p y x e r , w d f q j , r i m t n ]

(19)

Dodawanie grup elementów

Klasy Arrays i Collections z biblioteki java.util udostępniają metody narzędziowe grupujące elementy do postaci kolekcji Collection.

Metoda Arrays.asList() przyjmuje tablicę albo listę elementów wymienionych po przecinku (za pomocą zmiennych list argumentów) i zwraca obiekt List.

Metoda Collections.addAll() przyjmuje obiekt Collection oraz tablicę bądź listę elementów i dodaje zawartość tablicy bądź komplet elementów do

wskazanego obiektu Collection.

Kolejny przykład ilustruje obie metody, a także bardziej konwencjonalną metodę addAll(), będącą na wyposażeniu wszystkich podtypów Collection.

Monika Wrzosek (IM UG) Programowanie obiektowe 226 / 231

(20)

i m p o r t j a v a . u t i l . ∗ ; p u b l i c c l a s s Main {

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) {

I n t e g e r [ ] i n t y = { 1 2 , 1 7 , 2 0 , 5 0 , 3 2 , 9 6 , 3 2 , 7 7 , 5 4 , 9 9 } ;

S y s t e m . o u t . p r i n t l n ("Uż y c i e k o n s t r u k t o r a i A r r a y s . a s L i s t ( ) ") ; L i s t <I n t e g e r > l i s t a = new A r r a y L i s t <>( A r r a y s . a s L i s t ( i n t y ) ) ; S e t <I n t e g e r > z b i o r = new H a s h Se t <>( A r r a y s . a s L i s t ( i n t y ) ) ;

Queue<I n t e g e r > k o l e j k a = new P r i o r i t y Q u e u e <>( A r r a y s . a s L i s t ( i n t y ) ) ; S y s t e m . o u t . p r i n t l n ( l i s t a + " \ n " + z b i o r + " \ n " + k o l e j k a ) ;

l i s t a . c l e a r ( ) ; z b i o r . c l e a r ( ) ; k o l e j k a . c l e a r ( ) ;

S y s t e m . o u t . p r i n t l n (" \nUż y c i e C o l l e c t i o n s . a d d A l l ( ) ") ; C o l l e c t i o n s . a d d A l l ( l i s t a , i n t y ) ;

C o l l e c t i o n s . a d d A l l ( z b i o r , i n t y ) ; C o l l e c t i o n s . a d d A l l ( k o l e j k a , i n t y ) ;

S y s t e m . o u t . p r i n t l n ( l i s t a + " \ n " + z b i o r + " \ n " + k o l e j k a ) ; l i s t a . c l e a r ( ) ; z b i o r . c l e a r ( ) ; k o l e j k a . c l e a r ( ) ;

S y s t e m . o u t . p r i n t l n (" \nUż y c i e domy ś l n e j metody a d d A l l i "

+ " A r r a y s . a s L i s t ( ) ") ;

l i s t a . a d d A l l ( A r r a y s . a s L i s t ( i n t y ) ) ; z b i o r . a d d A l l ( A r r a y s . a s L i s t ( i n t y ) ) ; k o l e j k a . a d d A l l ( A r r a y s . a s L i s t ( i n t y ) ) ;

S y s t e m . o u t . p r i n t l n ( l i s t a + " \ n " + z b i o r + " \ n " + k o l e j k a ) ; }

}

(21)

Uż y c i e k o n s t r u k t o r a i A r r a y s . a s L i s t ( ) [ 1 2 , 1 7 , 2 0 , 5 0 , 3 2 , 9 6 , 3 2 , 7 7 , 5 4 , 9 9 ] [ 3 2 , 9 6 , 1 7 , 5 0 , 9 9 , 2 0 , 5 4 , 1 2 , 7 7 ] [ 1 2 , 1 7 , 2 0 , 5 0 , 3 2 , 9 6 , 3 2 , 7 7 , 5 4 , 9 9 ]

Uż y c i e C o l l e c t i o n s . a d d A l l ( )

[ 1 2 , 1 7 , 2 0 , 5 0 , 3 2 , 9 6 , 3 2 , 7 7 , 5 4 , 9 9 ] [ 3 2 , 9 6 , 1 7 , 5 0 , 9 9 , 2 0 , 5 4 , 1 2 , 7 7 ] [ 1 2 , 1 7 , 2 0 , 5 0 , 3 2 , 9 6 , 3 2 , 7 7 , 5 4 , 9 9 ]

Uż y c i e domy ś l n e j metody a d d A l l i A r r a y s . a s L i s t ( ) [ 1 2 , 1 7 , 2 0 , 5 0 , 3 2 , 9 6 , 3 2 , 7 7 , 5 4 , 9 9 ]

[ 3 2 , 9 6 , 1 7 , 5 0 , 9 9 , 2 0 , 5 4 , 1 2 , 7 7 ] [ 1 2 , 1 7 , 2 0 , 5 0 , 3 2 , 9 6 , 3 2 , 7 7 , 5 4 , 9 9 ]

Monika Wrzosek (IM UG) Programowanie obiektowe 228 / 231

(22)

Interfejs Map

Odwzorowania (mapy, słowniki, tablice asocjacyjne) są kolekcjami

przechowującymi pary klucz-wartość. Elementy typu klucz pełnią niejako rolę indeksów, zaś wartość – właściwych elementów kolekcji.

Interfejs Map<Typ klucza, Typ wartości> posiada metody:

boolean containsKey(Object klucz)- zwraca true, gdy dany klucz istnieje, boolean containsValue(Object wartosc)- zwraca true, gdy dana wartość istnieje,

Object get(Object klucz)- zwraca przypisaną wartość pod konkretny klucz, Set keySet()- zwraca zbiór kluczy,

Object put(Object klucz, Object wartosc)- wstawia pod konkretny klucz żądaną wartość,

Object remove(Object klucz)- zwraca wartość klucz i usuwa dany wpis.

Interfejs Map implementuja m.in. klasy:

HashMap – implementacja oparta o tablice haszowe, zapewnia szybkie wyszukiwanie elementu na podstawie klucza,

TreeMap – implemetacja oparta na drzewach czerwono-czarnych, zapewnia posortowanie elementów (według klucza).

Otrzymujemy również klasę LinkedHashMap dziedziczącą z HashMap. To odwzorowanie na zewnątrz prezentuje porządek zgodny z kolejnością wstawiania.

(23)

i m p o r t j a v a . u t i l . ∗ ; p u b l i c c l a s s Main {

p u b l i c s t a t i c S t r i n g l o s u j S t r i n g ( ) {

c h a r[ ] c h a r s = " a b c d e f g h i j k l m n o p q r s t u v w x y z ". t o C h a r A r r a y ( ) ; S t r i n g B u i l d e r s b = new S t r i n g B u i l d e r ( ) ;

Random random = new Random ( ) ; f o r (i n t i = 0 ; i < 5 ; i ++) {

c h a r c = c h a r s [ random . n e x t I n t ( c h a r s . l e n g t h ) ] ; s b . a p p e n d ( c ) ;

}

r e t u r n s b . t o S t r i n g ( ) ; }

p u b l i c s t a t i c v o i d main ( S t r i n g [ ] a r g s ) { Random r a n d = new Random ( ) ;

Map<I n t e g e r , S t r i n g > map1 = new HashMap < >();

Map<I n t e g e r , S t r i n g > map2 = new LinkedHashMap < >();

Map<I n t e g e r , S t r i n g > map3 = new TreeMap < >();

f o r(i n t x =0; x <10; x++){

i n t v a r = r a n d . n e x t I n t ( 1 0 0 0 ) ; S t r i n g s = l o s u j S t r i n g ( ) ; map1 . p u t ( v a r , s ) ;

map2 . p u t ( v a r , s ) ; map3 . p u t ( v a r , s ) ; }

// cd . na k o l e j n y m s l a j d z i e

Monika Wrzosek (IM UG) Programowanie obiektowe 230 / 231

(24)

S y s t e m . o u t . p r i n t l n (" HashMap : \ n " + map1 ) ; S y s t e m . o u t . p r i n t l n (" LinkedHashMap : \ n " + map2 ) ; S y s t e m . o u t . p r i n t l n (" TreeMap : \ n " + map3 ) ; }

}

// k o n i e c k l a s y Main

HashMap :

{945= i d k y h , 742= p x a f t , 968= u v r m i , 905= semto , 761= s i g v j , 314= y x z z s , 718=phzow , 111= p b j u x , 607= egopu , 927= h r e t n }

LinkedHashMap :

{905= semto , 742= p x a f t , 718=phzow , 111= p b j u x , 968= u v r m i , 607= egopu , 927= h r e t n , 314= y x z z s , 945= i d k y h , 761= s i g v j }

TreeMap :

{111= p b j u x , 314= y x z z s , 607= egopu , 718=phzow , 742= p x a f t , 761= s i g v j , 905= semto , 927= h r e t n , 945= i d k y h , 968= u v r m i }

Cytaty