Poruszymy dzisiaj wszystkie trzy kolekcje w języku Java (a raczej ich rodzaje): "List", "Set" i "Map". Dosyć sporo się już napisało o niektórych konkretnych kolekcjach, więc warto teraz poznać te trzy typy, skonfrontować je między sobą, pokazać ich najlepsze zastosowania oraz zalety i wady. Zapraszam bardzo serdecznie!
Tweet |
KOLEKCJE W JĘZYKU JAVA. CHARAKTERYSTYKI RODZAJÓW
Kilkakrotnie padało w niektórych moich artykułach, że są trzy rodzaje kolekcji. Czas je dokładnie poznać:
- List (lista)
- Lista ma za zadanie przechowywanie elementów zachowując kolejność do której są dodawane. Elementy pobierane są przez podany indeks (jak w zwykłej tablicy), a one same mogą się powtarzać.
- PRZYKŁAD ZASTOSOWANIA: przechowywanie wszystkich przeciwników w grze
- PRZYKŁADY KOLEKCJI TEGO TYPU: "ArrayList", "LinkedList", "Vector"
- PRZYKŁAD ZASTOSOWANIA: przechowywanie wszystkich przeciwników w grze
- Lista ma za zadanie przechowywanie elementów zachowując kolejność do której są dodawane. Elementy pobierane są przez podany indeks (jak w zwykłej tablicy), a one same mogą się powtarzać.
- Set (zbiór)
- Zbiór to kolekcja mająca przechowywać wyłącznie unikatowe elementy. Klasa korzystająca z typu "Set" powinna mieć przesłonięte metody weryfikujące "równość" obiektów. Niektóre z kolekcji mają wbudowane sortowanie, co czyni je doskonałymi kandydatami do zadań wymagających organizacji danych w określonej kolejności przy jednoczesnym zagwarantowaniu niepowtarzalności elementów.
- Map (mapa)
- Mapa (określana też jako "słownik") jest kolekcją o specyficznej budowie typu "klucz-wartość". Jej działanie polega na przechowywaniu elementu na podstawie podanego klucza, który może być dowolnego typu (zawdzięczamy to typom generycznym). Wartości mogą się powtarzać, ale klucze już nie (para zostanie nadpisana, jeżeli wprowadzany klucz się powtórzy).
- PRZYKŁAD ZASTOSOWANIA: przechowywanie listy uczniów w danej klasie (kluczem jest liczba porządkowa, a wartością klasa typu "Student")
- PRZYKŁADY KOLEKCJI TEGO TYPU: "HashMap", "LinkedHashMap", "EnumMap"
- PRZYKŁAD ZASTOSOWANIA: przechowywanie listy uczniów w danej klasie (kluczem jest liczba porządkowa, a wartością klasa typu "Student")
- Mapa (określana też jako "słownik") jest kolekcją o specyficznej budowie typu "klucz-wartość". Jej działanie polega na przechowywaniu elementu na podstawie podanego klucza, który może być dowolnego typu (zawdzięczamy to typom generycznym). Wartości mogą się powtarzać, ale klucze już nie (para zostanie nadpisana, jeżeli wprowadzany klucz się powtórzy).
Widzicie sami, że wybór okazuje się większy niż można było przypuszczać. Lista jest najczęściej wykorzystywanym rodzajem ze względu na sławną kolekcję "ArrayList", którą można spokojnie nazwać najbardziej podstawową, aczkolwiek mając pewny problem można go jeszcze efektywniej rozwiązać zmieniając jedynie rodzaj kolekcji na inny.
Kolekcje w języku Java dzielą się na trzy rodzaje czy typy: listę, zbiór oraz słownik. Każda z nich pasuje do różnych zadań.
PRZYKŁAD KODU ŹRÓDŁOWEGO
Podsumujemy to sobie przykładem kodu korzystającego z trzech rodzajów kolekcji naraz:
KLASA "MAIN"
public class Main {
public static void main(String[] args) {
new Launcher();
}
}
KLASA "BOOK"
public class Book implements Comparable<Book> {
private final String title, author, publisher;
private final int year;
public Book(String author, String title, String publisher, int year) {
this.author = author;
this.title = title;
this.publisher = publisher;
this.year = year;
}
@Override
public int hashCode() {
return title.hashCode() + author.hashCode() + year;
}
@Override
public boolean equals(Object object) {
Book book = (Book)object;
return title.equals(book.title) && author.equals(book.author) && year == book.year;
}
@Override
public String toString() {
return author + ". " + title + ". " + publisher + ", " + year;
}
@Override
public int compareTo(Book book) {
return year - book.year;
}
}
KLASA "PERSON"
public class Person {
private final String name, surname;
private final int age;
public Person(String name, String surname, int age) {
this.name = name;
this.surname = surname;
this.age = age;
}
@Override
public String toString() {
return name + " " + surname + " - lat " + age;
}
}
KLASA "LAUNCHER"
import java. util.HashMap;
import java. util.TreeSet;
import java. util.ArrayList;
public class Launcher {
private ArrayList<Integer> integers;
private TreeSet<Book> books;
private HashMap<Integer, Person> persons;
public Launcher() {
createInstances();
addIntegersToList();
addBooksToSet();
addPersonsToMap();
integers.forEach(System.out::println);
books.forEach(System.out::println);
persons.forEach((k, v) -> System.out.println(k + ". " + v));
}
private void createInstances() {
integers = new ArrayList<>();
books = new TreeSet<>();
persons = new HashMap<>();
}
private void addIntegersToList() {
integers.add(56);
integers.add(-10);
integers.add(3008);
integers.add(56);
}
private void addBooksToSet() {
books.add(new Book("Kathy Sierra, Bert Bates", "Java. Rusz głową!", "O'Reilly", 2011));
books.add(new Book("Cay S. Horstmann", "Java. Podstawy", "Helion", 2020));
books.add(new Book("Brian W. Kernighan, Dennis M. Ritchie", "Język ANSI C. Programowanie", "Helion", 2010));
}
private void addPersonsToMap() {
persons.put(1, new Person("Jan", "Kowalski", 46));
persons.put(2, new Person("Piotr", "Janowski", 24));
persons.put(3, new Person("Gerard", "Okulski", 30));
}
}
Najbardziej wskazane jest skompilowanie powyższych klas i ujrzenie wyników. Po uruchomieniu programu, wypisane zostaną zawartości wszystkich kolekcji przy pomocy referencji do metody. Wyjątkiem jest mapa, która korzysta z wyrażenia lambda do wypisania klucza i przypisanej wartości. Lista przechowuje liczby, które mają prawo się powtarzać. Zbiór trzyma w sobie elementy niepowtarzalne i nie dopuści do wprowadzenia takiego samego elementu (wywołanie metody zostanie tak jakby zignorowane), przy czym jak powinna być ustalana decyzja czy jeden obiekt jest "równy" drugiemu, napisałem odrębny artykuł. A mapa przechowuje kluczyki i przypisane do nich wartości, lecz same w sobie elementy to są pary. Wolno wprowadzić ten sam klucz, ale wartość zostanie nadpisana bez uprzedzenia!
Jak sami widzicie, kolekcje w języku Java nie kończą się tylko na słynnym "ArrayList". Nie musi to być remedium na wszystkie problemy programistyczne. Warto dać szansę innym kolekcjom, które są lepiej wyspecjalizowane do pewnych zadań, a dany problem zostanie rozwiązany szybciej i efektywniej.