{"id":15031,"date":"2022-08-08T07:00:00","date_gmt":"2022-08-08T05:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=15031"},"modified":"2025-05-07T11:48:53","modified_gmt":"2025-05-07T09:48:53","slug":"collection-interface-co-warto-wiedziec","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/collection-interface-co-warto-wiedziec\/","title":{"rendered":"Collection interface \u2013 co warto wiedzie\u0107?"},"content":{"rendered":"\n<p>Interfejs \u201ejava.util.Collection\u201d to najwy\u017cszy w hierarchii interfejs kolekcji. Kolekcja reprezentuje grup\u0119 obiekt\u00f3w, kt\u00f3re mo\u017cemy nazwa\u0107 elementami. Java nie dostarcza \u017cadnej bezpo\u015bredniej implementacji dla tego interfejsu. Dostarcza za to interfejsy rozszerzaj\u0105ce Collection: List, Set oraz Queue oraz Deque, kt\u00f3re maj\u0105 swoje implementacje. Om\u00f3wimy je szerzej w tym artykule.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-1-2.png\"><img decoding=\"async\" width=\"601\" height=\"231\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-1-2.png\" alt=\"Interfejs Collection\" class=\"wp-image-15060\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-1-2.png 601w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-1-2-300x115.png 300w\" sizes=\"(max-width: 601px) 100vw, 601px\" \/><\/a><figcaption>Ryc. 1 Interfejs Collection<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>List<\/strong> <\/h2>\n\n\n\n<p>Lista jest interfejsem dedykowanym do uporz\u0105dkowanego przechowywania obiekt\u00f3w. Pozwala na dodawanie i usuwanie element\u00f3w jak w tablicy. Elementy s\u0105 indeksowane \u2013 mo\u017cemy dzi\u0119ki temu pobra\u0107 obiekt znajduj\u0105cy si\u0119 na konkretnej pozycji. W listach dozwolone s\u0105 duplikaty element\u00f3w.<\/p>\n\n\n\n<p>Du\u017cym u\u0142atwieniem w stosunku do tablic jest to, \u017ce nie musimy deklarowa\u0107 rozmiaru listy na pocz\u0105tku jej u\u017cywania. Oczywi\u015bcie mo\u017cemy to zrobi\u0107 i to si\u0119 zaleca, kiedy wiemy, jakiego rozmiaru listy potrzebujemy. W listach nie mo\u017cemy przechowywa\u0107 typ\u00f3w prymitywnych.<\/p>\n\n\n\n<p>Aby u\u017cy\u0107 listy musimy zaimportowa\u0107 pakiet:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nimport java.util.List;\n<\/pre><\/div>\n\n\n<p>Przyk\u0142adowe u\u017cycie listy, tworzymy instancje klasy ArrayList:<\/p>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java 7+<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nList&amp;lt;Integer&gt; list = new ArrayList&amp;lt;&gt;();\n<\/pre><\/div>\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Java 10+<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nvar items = new ArrayList&amp;lt;String&gt;();\n<\/pre><\/div>\n\n\n<p>Mo\u017cemy tak\u017ce utworzy\u0107 list\u0119 poprzez statyczn\u0105 metod\u0119 dost\u0119pn\u0105 w interfejsie List:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nList&amp;lt;Integer&gt; list = List.of(1, 2, 3, 4);\n<\/pre><\/div>\n\n\n<p>Metoda of() zwraca niemodyfikowaln\u0105 list\u0119 zawieraj\u0105c\u0105 podane w argumencie elementy. Pr\u00f3ba modyfikacji takiej listy sko\u0144czy si\u0119 rzuceniem wyj\u0105tku \u201eUnsupportedOperationException\u201d, jako argumentu metody nie mo\u017cna u\u017cy\u0107 nulla.<\/p>\n\n\n\n<p>Dobr\u0105 praktyk\u0105 przy u\u017cywaniu list jest deklaracja typu obiektu, jaki b\u0119dzie u\u017cywany. Zapewnia nam to, \u017ce je\u015bli spr\u00f3bujemy doda\u0107 do listy nieodpowiedni typ, to ju\u017c na etapie kompilacji otrzymamy b\u0142\u0105d. Mo\u017cemy tworzy\u0107 list\u0119 z dowolnych obiekt\u00f3w.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Najwa\u017cniejsze metody<\/h3>\n\n\n\n<p>Do najwa\u017cniejszych metod nale\u017c\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>add() \u2013 dodaje element na koniec listy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nlist.add(5); \/\/ &#x5B;5]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>addAll() \u2013 dodaje wszystkie elementy listy do innej listy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nList&amp;lt;Integer&gt; list2 = List.of(1, 2);\nlist.addAll(list2); \/\/ &#x5B;5, 1, 2]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>size() \u2013 zwraca ilo\u015b\u0107 element\u00f3w w li\u015bcie<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nint size = list.size(); \/\/ 3\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>get() \u2013 umo\u017cliwia pobranie elementu z listy, do metody podajemy indeks, na jakim znajduje si\u0119 element (numeracja listy zaczyna si\u0119 od 0)<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger = list.get(0); \/\/ 5\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>iterator() \u2013 zwraca obiekt iteratora, kt\u00f3ry umo\u017cliwia dost\u0119p do element\u00f3w<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nIterator&amp;lt;Integer&gt; iterator = list.iterator();\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>set() \u2013 aktualizuje element w danej pozycji listy(zast\u0119puje go)<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nlist.set(0, 9); \/\/ &#x5B;9, 1, 2]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>isEmpty() \u2013 zwraca \u201etrue\u201d kiedy lista nie posiada element\u00f3w<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nboolean isEmpty = list.isEmpty(); \/\/ false\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>toArray() \u2013 konwertuje list\u0119 na tablic\u0119<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nObject&#x5B;] objects = list.toArray();\n\/\/ Arrays.toString(objects) &#x5B;9, 1, 2]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>contains() \u2013 zwraca \u201etrue\u201d kiedy lista posiada podany element<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nboolean contains = list.contains(2); \/\/ true\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>remove() \u2013 usuwa element z listy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nlist.remove(1); \/\/ &#x5B;9, 2]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>removeAll() \u2013 usuwa wszystkie elementy z listy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nlist.removeAll(list2); \/\/ &#x5B;9]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>clear() \u2013 usuwa wszystkie elementy z listy (bardziej wydajne od removeAll)<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nlist.clear(); \/\/ &#x5B;]\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Rodzaje list<\/h3>\n\n\n\n<p>Poni\u017cej przybli\u017c\u0119 rodzaje list.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-2-1.png\"><img decoding=\"async\" width=\"517\" height=\"451\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-2-1.png\" alt=\"Interfejs List\" class=\"wp-image-15063\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-2-1.png 517w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-2-1-300x262.png 300w\" sizes=\"(max-width: 517px) 100vw, 517px\" \/><\/a><figcaption>Ryc. 2 Interfejs List<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>ArrayList \u2013 implementuje list\u0119 jako dynamiczn\u0105 tablic\u0119. Jej rozmiar zostanie automatyczne rozszerzony, je\u015bli nie b\u0119dzie wystarczaj\u0105cej ilo\u015bci miejsca, aby doda\u0107 kolejny element. Mo\u017cemy ustawi\u0107 domy\u015blny rozmiar listy podczas jej tworzenia:<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nList&amp;lt;Integer&gt; list = new ArrayList&amp;lt;&gt;(5);\n<\/pre><\/div>\n\n\n<p>Nie jest to obowi\u0105zkowe, jednak jest wydajniejsze ni\u017c automatyczne rozszerzanie listy. Kiedy lista jest rozszerzana to zwi\u0119ksza swoj\u0105 pojemno\u015b\u0107 o 50%.<\/p>\n\n\n\n<p>Zalety ArrayListy to szybie wyszukiwanie element\u00f3w i ich pobieranie. Mo\u017cemy w niej przechowywa\u0107 wiele warto\u015bci null oraz duplikaty, co w niekt\u00f3rych sytuacjach mo\u017ce by\u0107 widziane jako wada. Nie zaleca si\u0119 u\u017cywania ArrayListy w sytuacji, kiedy cz\u0119sto dodajemy i usuwamy elementy z listy. Kiedy usuwamy \u015brodkowy element z listy musimy przesun\u0105\u0107 wszystkie kolejne w stron\u0119 pocz\u0105tku.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-3.png\"><img decoding=\"async\" width=\"287\" height=\"241\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-3.png\" alt=\"Pami\u0119\u0107 w ArrayList\" class=\"wp-image-15065\"\/><\/a><figcaption>Ryc. 3 Pami\u0119\u0107 w ArrayList<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Vector \u2013 implementuje interfejs \u201eList\u201d tak samo jak \u201eArrayList\u201d i zapewnia podobn\u0105 funkcjonalno\u015b\u0107. R\u00f3\u017cni\u0105 si\u0119 one jednak kilkoma rzeczami:<ul><li>Vector jest zsynchronizowany.<\/li><li>Kiedy zape\u0142nimy Vector, powi\u0119ksza on swoj\u0105 wielko\u015b\u0107 o 100%, a nie tak jak ArrayList o 50%.<\/li><li>Vector jest star\u0105 klas\u0105 tzw. Legacy class.<\/li><li>Vector jest wolniejszy od ArrayList, poniewa\u017c jest zsynchronizowany. Przy u\u017cyciu wielu w\u0105tk\u00f3w wstrzymuje kolejne operacje, dop\u00f3ki nie zako\u0144czy poprzednich.<\/li><\/ul><\/li><\/ul>\n\n\n\n<p>Tworzenie wektora:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nVector&amp;lt;Integer&gt; vector = new Vector&amp;lt;&gt;();\n<\/pre><\/div>\n\n\n<p>Mo\u017cemy te\u017c przy tworzeniu poda\u0107 rozmiar:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nVector&amp;lt;Integer&gt; vector = new Vector&amp;lt;&gt;(5);\n<\/pre><\/div>\n\n\n<p>Nie zaleca si\u0119 u\u017cywania klasy Vector, poniewa\u017c w aplikacji jednow\u0105tkowej jest wolniejsza od ArrayList, a w wielow\u0105tkowej nie zapewnia pe\u0142nego bezpiecze\u0144stwa.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Stack \u2013 dzia\u0142a zgodnie z zasad\u0105 \u201eLast In First Out (LIFO)\u201d czyli element, kt\u00f3ry dodali\u015bmy jako ostatni, znajdzie si\u0119 na g\u00f3rze stosu.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-4.png\"><img decoding=\"async\" width=\"581\" height=\"311\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-4.png\" alt=\"Dodawanie i usuwanie element\u00f3w stosu\" class=\"wp-image-15067\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-4.png 581w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-4-300x161.png 300w\" sizes=\"(max-width: 581px) 100vw, 581px\" \/><\/a><figcaption>Ryc. 4 Dodawanie i usuwanie element\u00f3w stosu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Tworzenie stosu:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nStack&amp;lt;Integer&gt; stack = new Stack&amp;lt;&gt;();\n<\/pre><\/div>\n\n\n<p>Stack posiada te same metody co Vector oraz dodatkowo pi\u0119\u0107 swoich:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>push() \u2013 dodanie elementu na szczyt stosu<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nStack&amp;lt;Integer&gt; stack = new Stack&amp;lt;&gt;();\n \nstack.push(1);\nstack.push(2);\nstack.push(3);\n\/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>pop() \u2013 usuni\u0119cie elementu ze szczytu stosu<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger pop = stack.pop(); \/\/ &#x5B;1, 2]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>peek() \u2013 zwraca obiekt ze szczytu stosu<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger peek = stack.peek(); \/\/ 2\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>search() \u2013 wyszukuje element na stosie, zwraca jego pozycje od g\u00f3ry stosu<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nint search = stack.search(1); \/\/ 2\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>empty() \u2013 sprawdza czy stos jest pusty<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nboolean empty = stack.empty(); \/\/ false\n<\/pre><\/div>\n\n\n<p>Stosu u\u017cywamy, gdy chcemy zachowa\u0107 kolejno\u015b\u0107 naszych dzia\u0142a\u0144 lub stworzy\u0107 list\u0119, kt\u00f3ra obrazuje relacje ojciec \u2013 dziecko (parent \u2013 child). Zamiast klasy Stack zaleca si\u0119 u\u017cywanie ArrayDeque. Jednym z powod\u00f3w jest to, \u017ce Stack jest klas\u0105, a Deque interfejsem.<\/p>\n\n\n\n<p>Umo\u017cliwia to kontrol\u0119 i daje wi\u0119ksze mo\u017cliwo\u015bci przy u\u017cyciu na korzy\u015b\u0107 interfejsu. Dodatkowo, poprzez rozszerzenie klasy Vector, mo\u017cliwe jest pobieranie element\u00f3w przez ich indeks, co jest zaprzeczeniem podstawowego dzia\u0142ania stosu.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>LinkedList \u2013 przechowuje elementy w strukturze danych w postaci podw\u00f3jnie po\u0142\u0105czonej listy.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-5.png\"><img decoding=\"async\" width=\"581\" height=\"181\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-5.png\" alt=\"LinkedList - pami\u0119\u0107\" class=\"wp-image-15070\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-5.png 581w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-5-300x93.png 300w\" sizes=\"(max-width: 581px) 100vw, 581px\" \/><\/a><figcaption>Ryc. 5 LinkedList &#8211; pami\u0119\u0107 <\/figcaption><\/figure><\/div>\n\n\n\n<p>Ka\u017cdy element listy sk\u0142ada si\u0119 z trzech w\u0119z\u0142\u00f3w:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>PREV <\/strong>\u2013 przechowuje adres w pami\u0119ci do poprzedniego elementu listy, dla pierwszego elementu b\u0119dzie to null.<\/li><li><strong>NEXT <\/strong>\u00ad\u2013 przechowuje adres w pami\u0119ci do nast\u0119pnego elementu listy, dla ostatniego elementu b\u0119dzie to null.<\/li><li><strong>DATA<\/strong> \u2013 przechowuje dane, kt\u00f3re dodali\u015bmy do listy.<\/li><\/ul>\n\n\n\n<p>Tworzenie nowej listy:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nLinkedList&amp;lt;Integer&gt; linkedList = new LinkedList&amp;lt;&gt;();\n<\/pre><\/div>\n\n\n<p>LinkedList opr\u00f3cz interfejsu \u201eList\u201d implementuje r\u00f3wnie\u017c \u201eQueue\u201d i \u201eDeque\u201d.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-6.png\"><img decoding=\"async\" width=\"161\" height=\"461\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-6.png\" alt=\"LinkedList - hierarchia\" class=\"wp-image-15073\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-6.png 161w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-6-105x300.png 105w\" sizes=\"(max-width: 161px) 100vw, 161px\" \/><\/a><figcaption>Ryc. 6 LinkedList &#8211; hierarchia<\/figcaption><\/figure><\/div>\n\n\n\n<p>Pozwala to na implementacj\u0119 metod pochodz\u0105cych z tych interfejs\u00f3w, takich jak:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nQueue&amp;lt;Integer&gt; queueList = new LinkedList&amp;lt;&gt;();\n \nqueueList.add(1);\nqueueList.add(2);\nqueueList.add(3); \n        \/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>poll() \u2013 Queue \u2013 zwraca i usuwa pierwszy element listy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger poll = queueList.poll(); \/\/ 1\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>peek() \u2013 Queue \u2013 zwraca pierwszy element listy (head)<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nInteger peek = queueList.peek(); \/\/ 2\n \n \nDeque&amp;lt;Integer&gt; dequeList = new LinkedList&amp;lt;&gt;();\ndequeList.add(1);\ndequeList.add(2);\ndequeList.add(3);\n\/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>addFirst() \u2013 Deque \u2013 dodaje element na pocz\u0105tek listy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndequeList.addFirst(4); \/\/ &#x5B;4, 1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>addLast() \u2013 Deque \u2013 dodaje element na koniec listy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndequeList.addLast(5); \/\/ &#x5B;4, 1, 2, 3, 5]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>getFirst() \u2013 Deque \u2013 zwraca pierwszy element<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger first = dequeList.getFirst(); \/\/ 4\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>getLast() \u2013 Deque \u2013 zwraca ostatni element<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger last = dequeList.getLast(); \/\/ 5\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>removeFirst() \u2013 Deque \u2013 usuwa pierwszy element<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndequeList.removeFirst(); \/\/ &#x5B;1, 2, 3, 5]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>removeLast() \u2013 Deque \u2013 usuwa ostatni element<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndequeList.removeLast(); \/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>offer() \u2013 Deque \u2013 dodaje element na koniec listy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndequeList.offer(6); \/\/ &#x5B;1, 2, 3, 6]\n<\/pre><\/div>\n\n\n<p>Zalet\u0105 tej listy jest szybkie dodawanie i usuwanie element\u00f3w. Wad\u0105 szybko\u015b\u0107 pobierania element\u00f3w. Podczas usuwania elementu ze \u015brodka listy musz\u0105 zaktualizowa\u0107 si\u0119 tylko elementy po obu stronach usuwanego obiektu.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-7.png\"><img decoding=\"async\" width=\"761\" height=\"450\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-7.png\" alt=\"\" class=\"wp-image-15075\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-7.png 761w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-7-300x177.png 300w\" sizes=\"(max-width: 761px) 100vw, 761px\" \/><\/a><figcaption>Ryc. 7 LinkedList &#8211; dodawanie element\u00f3w<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Set<\/h2>\n\n\n\n<p>Set jest kolejnym interfejsem wchodz\u0105cym w sk\u0142ad \u201eCollection\u201d. Charakteryzuje si\u0119 on tym, \u017ce przechowuje unikalne elementy. Nie mo\u017cemy odwo\u0142ywa\u0107 si\u0119 do konkretnego elementu zbioru, poniewa\u017c nie wiadomo, na jakiej pozycji si\u0119 on znajduje. Zale\u017cnie od interpretacji Set mo\u017cemy sortowa\u0107.<\/p>\n\n\n\n<p>Przyk\u0142adowa implementacja zbioru:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nSet&amp;lt;Integer&gt; set = new HashSet&amp;lt;&gt;();\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Najwa\u017cniejsze metody<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>add() \u2013 dodaje elementy do zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nset.add(1);\nset.add(2);\nset.add(3); \/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>addAll() \u2013 dodaje wszystkie elementy z kolekcji do zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nList&amp;lt;Integer&gt; list = List.of(5, 6, 7);\n \nset.addAll(list); \/\/ &#x5B;1, 2, 3, 5, 6, 7]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>iterator() \u2013 zwraca iterator, kt\u00f3rego mo\u017cemy u\u017cy\u0107 do dost\u0119pu do elementu<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nIterator&amp;lt;Integer&gt; iterator = set.iterator();\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>remove() \u2013 usuwa element ze zbioru, jako parametr podajemy element, kt\u00f3ry chcemy usun\u0105\u0107, a nie, jak w przypadku listy, indeks<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nset.remove(1); \/\/ &#x5B;2, 3, 5, 6, 7]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>retainAll() \u2013 zachowuje wszystkie elementy zbioru, kt\u00f3re s\u0105 zawarte w innej kolekcji<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nset.retainAll(list); \/\/ &#x5B;5, 6, 7]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>size() \u2013 zwraca ilo\u015b\u0107 element\u00f3w zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nint size = set.size(); \/\/ 3\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>toArray() \u2013 zwraca tablic\u0119 zawieraj\u0105c\u0105 elementy zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nObject&#x5B;] objects = set.toArray();\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>contains() \u2013 zwraca true, je\u015bli zbi\u00f3r zawiera podany element<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nboolean contains = set.contains(7); \/\/ true\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>containsAll() \u2013 zwraca true, je\u015bli zbi\u00f3r zawiera wszystkie podane elementy<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nboolean b = set.containsAll(list); \/\/ true\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>hashCode() \u2013 zwraca warto\u015b\u0107 hasz zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nint i = set.hashCode(); \/\/ 18\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>removeAll() \u2013 usuwa wszystkie elementy ze zbioru zawarte w podanej kolekcji<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nset.removeAll(list); \/\/ &#x5B;]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>clear() \u2013 usuwa wszystkie elementy ze zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nset.clear(); \/\/ &#x5B;]\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Rodzaje<\/h3>\n\n\n\n<p>W interfejsie Set wyr\u00f3\u017cniamy poni\u017csze rodzaje.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-8.png\"><img decoding=\"async\" width=\"681\" height=\"391\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-8.png\" alt=\"\" class=\"wp-image-15077\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-8.png 681w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-8-300x172.png 300w\" sizes=\"(max-width: 681px) 100vw, 681px\" \/><\/a><figcaption>Ryc. 8 Interfejs Set &#8211; hierarchia<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>HashSet \u2013 podstawowa implementacja zbioru. Zapewnia unikalno\u015b\u0107 element\u00f3w, ale nie gwarantuje kolejno\u015bci element\u00f3w. Wewn\u0119trznie wykorzystuje tablice mieszaj\u0105c\u0105, co wymaga implementacji metod \u201ehashCode\u201d i \u201eequals()\u201d. W HashSet mo\u017cemy przechowywa\u0107 warto\u015b\u0107 null. HashSet jest zbiorem niesynchronizowanym. Je\u015bli chcemy u\u017cywa\u0107 go w wielow\u0105tkowo\u015bci, sami musimy zapewni\u0107 synchronizacje.<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nSet&amp;lt;Integer&gt; set = new HashSet&amp;lt;&gt;();\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>LinkedHashSet \u2013 implementacja zbioru, kt\u00f3ra zapewnia funkcjonalno\u015b\u0107 tablicy mieszaj\u0105cej oraz listy po\u0142\u0105czonej. Elementy zbioru s\u0105 przechowywane podobnie jak w HashSet, ale zachowuje kolejno\u015b\u0107 ich dodawania. Tak samo jak HashSet mo\u017cemy przechowywa\u0107 warto\u015b\u0107 null.<\/li><\/ul>\n\n\n\n<p>Tworzenie LinkedHashSet z podan\u0105 pojemno\u015bci\u0105 (capacity) oraz wsp\u00f3\u0142czynnikiem okre\u015blaj\u0105cym, kiedy lista ma zwi\u0119kszy\u0107 swoj\u0105 pojemno\u015b\u0107 (loadFactor):<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nLinkedHashSet&amp;lt;Integer&gt; numbers = new LinkedHashSet&amp;lt;&gt;(8, 0.6);\n<\/pre><\/div>\n\n\n<p>Podana lista mo\u017ce przechowa\u0107 8 element\u00f3w oraz zwi\u0119kszy swoj\u0105 pojemno\u015b\u0107 dwukrotnie, kiedy zape\u0142ni si\u0119 w 60%.<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>EnumSet \u2013 jest implementacj\u0105 zbioru, kt\u00f3ra dzia\u0142a wy\u0142\u0105cznie z typami wyliczeniowymi. Przechowujemy w nim obiekty, kt\u00f3re s\u0105 enumami. Nie mo\u017cemy przechowywa\u0107 warto\u015bci null, a zbi\u00f3r nie jest bezpieczny do u\u017cycia w wielow\u0105tkowo\u015bci. Elementy s\u0105 przechowywane w kolejno\u015bci, w jakiej zadeklarowane s\u0105 enumy.<\/li><\/ul>\n\n\n\n<p>EnumSet u\u017cywa iteratora, kt\u00f3ry dzia\u0142a na kopii zbioru, wi\u0119c nie wyrzuci wyj\u0105tku, je\u015bli co\u015b zmieni si\u0119 w zbiorze podczas jego iteracji. EnumSet powinien by\u0107 zawsze u\u017cywany, kiedy chcemy stworzy\u0107 zbi\u00f3r enum\u00f3w, poniewa\u017c jest bardziej wydajny od innych rodzaj\u00f3w zbior\u00f3w m.in. przez to, \u017ce nie trzeba por\u00f3wnywa\u0107 zahaszowanych warto\u015bci, aby z niego korzysta\u0107.<\/p>\n\n\n\n<p>EnumSet jest klas\u0105 abstrakcyjn\u0105, JDK dostarcza dwie implementacje tej klasy, jednak nie korzystamy z nich bezpo\u015brednio. S\u0105 to klasy package-private:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>RegularEnumSet \u2013 dla zbior\u00f3w do 64 element\u00f3w<\/li><li>JumboEnumSet \u2013 dla zbior\u00f3w powy\u017cej 64 element\u00f3w<\/li><\/ul>\n\n\n\n<p>Klasa dostarcza r\u00f3wnie\u017c kilka metod statycznych pozwalaj\u0105cych tworzy\u0107 zbi\u00f3r. W takim przypadku tworzona jest implementacja zale\u017cna od ilo\u015bci element\u00f3w w enumie.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nenum Size {\n                    SMALL, MEDIUM, LARGE, EXTRALARGE\n            }\n \n            Set&amp;lt;Size&gt; set = EnumSet.allOf(Size.class);\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>TreeSet \u2013 przechowuje zbi\u00f3r pod postaci\u0105 drzewa. Ta implementacja nie zapewnia zapami\u0119tania kolejno\u015bci dodawania element\u00f3w, za to przechowuje je w posortowany spos\u00f3b (rosn\u0105co). Nie mo\u017cemy w nim przechowywa\u0107 nulli oraz obiekt\u00f3w, kt\u00f3re nie implementuj\u0105 interfejsu \u201eComparable\u201d, nie jest bezpieczny przy u\u017cywaniu w\u0105tk\u00f3w.<\/li><\/ul>\n\n\n\n<p>W por\u00f3wnaniu do HashSet ten zbi\u00f3r zapewnia wolniejsze przetwarzanie danych, poniewa\u017c ka\u017cdy dodany element musi zosta\u0107 posortowany. TreeSet posiada te\u017c kilka metod zaimplementowanych z NavigableSet oraz SortedSet:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nTreeSet&amp;lt;Integer&gt; treeSet = new TreeSet&amp;lt;&gt;();\n \n            treeSet.add(1);\n            treeSet.add(2);\n            treeSet.add(3); \/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>lower() \u2013 zwraca ze zbioru najwi\u0119kszy element, kt\u00f3ry jest mniejszy od podanego<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger lower = treeSet.lower(2); \/\/ 1\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>floor() \u00ad\u2013 zwraca najmniejszy element po\u015br\u00f3d tych, kt\u00f3re s\u0105 mniejsze od podanego elementu, je\u015bli podany element istnieje w zbiorze, to go zwr\u00f3ci<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger floor = treeSet.floor(2); \/\/ 2\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>ceiling() \u2013 zwraca najmniejszy element po\u015br\u00f3d tych, kt\u00f3re s\u0105 wi\u0119ksze od podanego elementu, je\u015bli podany element istnieje w zbiorze, to go zwr\u00f3ci<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger ceiling = treeSet.ceiling(2); \/\/ 2\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>higher() \u2013 zwraca ze zbioru najmniejszy element, kt\u00f3ry jest wi\u0119kszy od podanego<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger higher = treeSet.higher(2); \/\/ 3\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>pollFirst() \u2013 zwraca i usuwa pierwszy element zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger poolFirst = treeSet.pollFirst(); \/\/ 1\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>pollLast() \u2013 zwraca i usuwa ostatni element zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger poolLast = treeSet.pollLast(); \/\/ 3\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>first() \u2013 zwraca pierwszy element zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger first = treeSet.first(); \/\/ 2\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>last() \u2013 zwraca ostatni element zbioru<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger last = treeSet.last(); \/\/ 2\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>Queue\/Deque<\/strong><\/h2>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nQueue&amp;lt;Integer&gt; queue = new PriorityQueue&amp;lt;&gt;();\n<\/pre><\/div>\n\n\n<p>Interfejs Queue wchodzi w sk\u0142ad Collection. Charakteryzuje si\u0119 tym, \u017ce mamy dost\u0119p do danych jedynie z pocz\u0105tku i ko\u0144ca zbioru. G\u0142\u00f3wnym zadaniem kolejek jest porz\u0105dkowanie zbioru w okre\u015blonej wcze\u015bniej kolejno\u015bci.<\/p>\n\n\n\n<p>Mo\u017cemy wyr\u00f3\u017cni\u0107 dwa podstawowe typy kolejek:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>FIFO \u2013 first in, first out \u2013 wstawiamy element na koniec listy, a zdejmujemy go z pocz\u0105tku<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-9-1.png\"><img decoding=\"async\" width=\"861\" height=\"231\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-9-1.png\" alt=\"Kolejka FIFO\" class=\"wp-image-15081\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-9-1.png 861w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-9-1-300x80.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-9-1-768x206.png 768w\" sizes=\"(max-width: 861px) 100vw, 861px\" \/><\/a><figcaption>Ryc. 9 Kolejka FIFO<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>LIFO \u2013 last in, first out \u2013 wstawiamy element na pocz\u0105tek kolejki i zdejmujemy te\u017c pierwszy element<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-10.png\"><img decoding=\"async\" width=\"671\" height=\"231\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-10.png\" alt=\"Kolejka LIFO\" class=\"wp-image-15083\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-10.png 671w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-10-300x103.png 300w\" sizes=\"(max-width: 671px) 100vw, 671px\" \/><\/a><figcaption>Ryc. 10 Kolejka LIFO<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Deque natomiast to kolejka pozwala na dodawanie i usuwanie element\u00f3w z obu jej stron.<\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-11.png\"><img decoding=\"async\" width=\"661\" height=\"232\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-11.png\" alt=\"Deque - dzia\u0142anie\" class=\"wp-image-15085\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-11.png 661w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-11-300x105.png 300w\" sizes=\"(max-width: 661px) 100vw, 661px\" \/><\/a><figcaption>Ryc. 11 Deque &#8211; dzia\u0142anie<\/figcaption><\/figure><\/div>\n\n\n\n<h3 class=\"wp-block-heading\">Najwa\u017cniejsze metody<\/h3>\n\n\n\n<p><strong>Queue:<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nQueue&amp;lt;Integer&gt; queue = new PriorityQueue&amp;lt;&gt;();\n \n        queue.add(1);\n        queue.add(2);\n        queue.add(3); \/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>add() \u2013 dodaje element do kolejki, je\u015bli operacja si\u0119 powiedzie\u2013 zwraca true, je\u015bli nie \u2013 rzuca wyj\u0105tek<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nboolean add = queue.add(4); \/\/ true\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>offer() \u2013 dodaje element do kolejki, je\u015bli operacja si\u0119 powiedzie \u2013 zwraca true, je\u015bli nie \u2013 zwraca false<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nboolean offer = queue.offer(5); \/\/ true\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>element() \u2013 zwraca pierwszy element kolejki, rzuca wyj\u0105tek, je\u015bli kolejka jest pusta<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger element = queue.element(); \/\/ 1\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>peek() \u2013 zwraca pierwszy element kolejki, zwraca null, je\u015bli kolejka jest pusta<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger peek = queue.peek(); \/\/ 1\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>remove() \u2013 zwraca i usuwa pierwszy element kolejki, rzuca wyj\u0105tek, je\u015bli kolejka jest pusta<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger remove = queue.remove(); \/\/ 1 \/\/ &#x5B;2, 4, 3, 5]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>poll() \u2013 zwraca i usuwa pierwszy element kolejki, zwraca null, je\u015bli kolejka jest pusta<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger poll = queue.poll(); \/\/ 2 \/\/ &#x5B;3, 4, 5]\n<\/pre><\/div>\n\n\n<p><strong>Deque:<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nDeque&amp;lt;Integer&gt; deque = new ArrayDeque&amp;lt;&gt;();\n \n        deque.add(1);\n        deque.add(2);\n        deque.add(3); \/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>addFirst() \u2013 dodaje element na pocz\u0105tek kolejki<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndeque.addFirst(4); \/\/ &#x5B;4, 1, 2, 3]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>addLast() \u2013 dodaje element na koniec kolejki<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndeque.addLast(5); \/\/ &#x5B;4, 1, 2, 3, 5]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>offerFirst() \u2013 dodaje element na pocz\u0105tek kolejki, je\u015bli operacja si\u0119 powiod\u0142a zwraca true<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndeque.offerFirst(6); \/\/ &#x5B;6, 4, 1, 2, 3, 5]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>offerLast() \u2013 dodaje element na koniec kolejki, je\u015bli operacja si\u0119 powiod\u0142a \u2013 zwraca true<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\ndeque.offerLast(7); \/\/ &#x5B;6, 4, 1, 2, 3, 5, 7]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>getFirst() \u2013 zwraca pierwszy element z kolejki<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger first = deque.getFirst(); \/\/ 1\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>getLast() \u2013 zwraca ostatni element z kolejki<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger last = deque.getLast(); \/\/ 3\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>peekFirst() \u2013 zwraca pierwszy element kolejki<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger peekFirst = deque.peekFirst(); \/\/ 1\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>peekLast() \u2013 zwraca ostatni element kolejki<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nInteger peekLast = deque.peekLast(); \/\/ 3\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>removeFirst() \u2013 zwraca i usuwa pierwszy element kolejki<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger removeFirst = deque.removeFirst(); \/\/ &#x5B;4, 1, 2, 3, 5, 7]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>removeLast() \u2013 zwraca i usuwa ostatni element kolejki<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger removeLast = deque.removeLast(); \/\/ &#x5B;4, 1, 2, 3, 5]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>pollFirst() \u2013 zwraca i usuwa pierwszy element kolejki, zwraca null, je\u015bli kolejka jest pusta<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger pollFirst = deque.pollFirst();\/\/ &#x5B;1, 2, 3, 5]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>pollLast() \u2013 zwraca i usuwa ostatni element kolejki, zwraca null, je\u015bli kolejka jest pusta<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nInteger pollLast = deque.pollLast(); \/\/ &#x5B;1, 2, 3]\n<\/pre><\/div>\n\n\n<h3 class=\"wp-block-heading\">Rodzaje<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li>Queue:<ul><li>PriorityQueue \u2013 bazuje na implementacji stosu. Elementy s\u0105 uk\u0142adane w naturalnym porz\u0105dku, poprzez por\u00f3wnanie przez zapewniony Comparator. Kolejka nie pozwala na przechowywanie warto\u015bci null oraz obiekt\u00f3w, kt\u00f3rych nie da si\u0119 ze sob\u0105 por\u00f3wna\u0107. <br>Kolejka uk\u0142ada dodane elementy w kolejno\u015bci od najmniejszego do najwi\u0119kszego, tak wi\u0119c jej pocz\u0105tkiem jest najmniejszy element. PriorityQueue nie jest bezpieczna w przypadku program\u00f3w wielow\u0105tkowych, do tego zadania Java zapewnia klas\u0119 PriorityBlockingQueue.<\/li><\/ul><\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-12.png\"><img decoding=\"async\" width=\"861\" height=\"231\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-12.png\" alt=\"PriorityQueue - dzia\u0142anie\" class=\"wp-image-15087\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-12.png 861w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-12-300x80.png 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-12-768x206.png 768w\" sizes=\"(max-width: 861px) 100vw, 861px\" \/><\/a><figcaption>Ryc. 12 PriorityQueue &#8211; dzia\u0142anie<\/figcaption><\/figure><\/div>\n\n\n\n<ul class=\"wp-block-list\"><li>Deque:<ul><li>ArrayDeque \u2013 jest implementowana jako dynamiczna tablica, do kt\u00f3rej mo\u017cemy dodawa\u0107 elementy z przodu i z ty\u0142u kolejki. Nie mo\u017cemy dodawa\u0107 nulli. Kolejka nie jest bezpieczna w aplikacjach wielow\u0105tkowych. Je\u017celi pocz\u0105tek kolejki i jej koniec wskazuj\u0105 na siebie po dodaniu nowego elementu, tablica automatycznie podwaja swoj\u0105 wielko\u015b\u0107.<\/li><\/ul><\/li><\/ul>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-13.png\"><img decoding=\"async\" width=\"561\" height=\"182\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-13.png\" alt=\"ArrayDeque - hierarchia\" class=\"wp-image-15089\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-13.png 561w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Ryc.-13-300x97.png 300w\" sizes=\"(max-width: 561px) 100vw, 561px\" \/><\/a><figcaption>Ryc. 13 ArrayDeque &#8211; hierarchia<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Interfejs Iterator<\/strong><\/h2>\n\n\n\n<p>Interfejsem zwi\u0105zanym z \u201eCollection\u201d jest \u201ejava.util.Iterator\u201d. Pozwala on na dost\u0119p do element\u00f3w kolekcji. Ka\u017cda z nich posiada metod\u0119 \u201eiterator\u201d, kt\u00f3ra zwraca instancje iteratora u\u017cywanego do poruszania si\u0119 po kolekcji.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Metody Iteratora<\/h3>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nArrayList&amp;lt;Integer&gt; numbers = new ArrayList&amp;lt;&gt;();\nnumbers.add(1);\nnumbers.add(3);\nnumbers.add(2);\n\/\/ &#x5B;1, 3, 2]\n \nIterator&amp;lt;Integer&gt; iterate = numbers.iterator();\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>hasNext() \u2013 zwraca \u201etrue\u201d je\u015bli istnieje element w kolekcji<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nboolean b = iterate.hasNext(); \/\/ true\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>next() \u2013 zwraca nast\u0119pny element kolekcji<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nint number = iterate.next(); \/\/ 1\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>remove() \u2013 usuwa ostatni element zwr\u00f3cony przez next()<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\niterate.remove(); \/\/ numbers &#x5B;3, 2]\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>forEachRemaining() \u2013 wykonuje akcje dla ka\u017cdego elementu kolekcji<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; first-line: 0; title: ; notranslate\" title=\"\">\nwhile(iterate.hasNext()) {\n\t\titerate.forEachRemaining(System.out::print);\n}\n\/\/ 32\n\n<\/pre><\/div>\n\n\n<h2 class=\"wp-block-heading\"><strong>\u0179r\u00f3d\u0142a<\/strong><\/h2>\n\n\n\n<ol class=\"wp-block-list\" type=\"1\"><li><a href=\"https:\/\/www.ceneo.pl\/80489822\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Java 11 Cookbook \u2013 Nick Samoylov, Mohamed Sanaulla<\/a><\/li><li><a href=\"https:\/\/lubimyczytac.pl\/ksiazka\/4946366\/java-podstawy-wydanie-xi\" target=\"_blank\" rel=\"noreferrer noopener\" rel=\"nofollow\" >Java podstawy \u2013 Cay S. Horstmann<\/a><\/li><\/ol>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u015bli interesuje Was obszar Javy, polecamy inne artyku\u0142y naszych ekspert\u00f3w m.in. <a href=\"https:\/\/sii.pl\/blog\/wyrazenie-lambda-w-javie\/?category=development-na-twardo&amp;tag=java,software-development,wyrazenie-lambda\" target=\"_blank\" rel=\"noreferrer noopener\">Wyra\u017cenie lambda w Javie<\/a> oraz <a href=\"https:\/\/sii.pl\/blog\/java-2-0-czyli-kotlin\/?category=development-na-twardo&amp;tag=java,kotlin\" target=\"_blank\" rel=\"noreferrer noopener\">Java 2.0 czyli Kotlin. <\/a><\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;15031&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;6&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.5\\\/5 ( votes: 6)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Collection interface \u2013 co warto wiedzie\u0107?&quot;,&quot;width&quot;:&quot;125&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 125px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.5\/5 ( votes: 6)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Interfejs \u201ejava.util.Collection\u201d to najwy\u017cszy w hierarchii interfejs kolekcji. Kolekcja reprezentuje grup\u0119 obiekt\u00f3w, kt\u00f3re mo\u017cemy nazwa\u0107 elementami. Java nie dostarcza \u017cadnej &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/collection-interface-co-warto-wiedziec\/\">Continued<\/a><\/p>\n","protected":false},"author":358,"featured_media":19607,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":10,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[2427,1508,330],"class_list":["post-15031","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-digital","tag-collection-interface","tag-java"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2022\/08\/Collection-interface-\u2013-co-warto-wiedziec-1.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/15031"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/358"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=15031"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/15031\/revisions"}],"predecessor-version":[{"id":17998,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/15031\/revisions\/17998"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/19607"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=15031"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=15031"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=15031"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}