Poruszymy dzisiaj podsumowanie wszystkich trzech typów kolekcji występujących w języku Java: List vs. Set vs. Map. Dosyć sporo się już napisało o niektórych konkretnych kolekcjach więc warto teraz skonfrontować te trzy typy, pokazać ich najlepsze zastosowania oraz zalety i wady. Zapraszam bardzo serdecznie!

LIST VS. SET VS. MAP. CHARAKTERYSTYKI RODZAJÓW

Kilkakrotnie padało w niektórych artykułach, że są trzy rodzaje kolekcji. Oto one.

  • List
    • Lista ma za zadanie przechowywanie elementów zachowując kolejność do której zostały dodane. Elementy pobierane są przez podany indeks (jak w zwykłej tablicy), a także mogą się powtarzać.
      • PRZYKŁAD ZASTOSOWANIA: przechowywanie przeciwników w grze, którzy pojawiają się zgodnie z kolejnością ich wprowadzenia do listy
      • PRZYKŁADY KOLEKCJI TEGO TYPU: "ArrayList", "LinkedList", "Vector"
  • Set
    • 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.
      • PRZYKŁAD ZASTOSOWANIA: przechowywanie książek o unikatowym numerze ISBN
      • PRZYKŁADY KOLEKCJI TEGO TYPU: "HashSet", "LinkedHashSet", "TreeSet"
  • Map
    • Mapa (a raczej "słownik") jest kolekcją o specyficznej budowie typu "klucz-wartość". Jej przechowywanie polega na identyfikacji elementu na podstawie podanego klucza, który może być dowolnego typu (może to być nawet klasa jako referencja). Wartości mogą się powtarzać, ale klucze już nie.
      • PRZYKŁAD ZASTOSOWANIA: przechowywanie listy uczniów w danej klasie
      • PRZYKŁADY KOLEKCJI TEGO TYPU: "HashMap", "LinkedHashMap", "EnumMap"

Widzicie sami, że wybór okazuje się większy niż można było przypuszczać. Typ "List" jest najczęściej wykorzystywany 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.

List vs. Set vs. Map - konfrontacja kolekcji w Javie

Java posiada wbudowane trzy rodzaje kolekcji: "List", "Set" oraz "Map". 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.ArrayList;
import java. util.HashMap;
import java. util.TreeSet;

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);
	}

	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.


Jak sami widzicie, "List" nie musi być remedium na wszystkie problemy programistyczne. Warto dać szansę innym kolekcjom, które są lepiej wyspecjalizowane do pewnych zadań.

PODOBNE ARTYKUŁY