1. Контейнери и колекции

Контейнерите or колекциите са класове, които ви позволяват да съхранявате и обработвате няколко обекта наведнъж. Вече познавате два вида контейнери: масиви и списъци.

Java има няколко десетки колекции, всяка от които съхранява елементи по свой специфичен начин. Ето няколко от тях:

колекция Клас Описание
List
ArrayList
списък
LinkedList
Свързан списък
Vector
вектор
Stack
Стек
Set
HashSet
Комплект
TreeSet
LinkedHashSet
Queue
PriorityQueue
Опашка
ArrayQueue
Map
HashMap
Карта/Речник
TreeMap
HashTable

Тук имената са малко двусмислени. В повечето езици за програмиране всички тези структури от данни се наричат ​​колекции, но не и в Java. В Java някои от тези класове реализират интерфейса Collection, докато други не.

Съответно колекциите се разделят на колекции в широк смисъл и колекции в тесен смисъл (само тези, които имплементират Collectionинтерфейса).

Така че, за да избегнем объркване, когато говорим за колекции , имаме предвид в тесния смисъл на думата, т.е. класове, които имплементират интерфейса Collection. Всички типове и са Listколекции . Колекциите в широк смисъл обикновено се наричат ​​контейнери . Те включват типове като и масиви.SetQueueMap


2. HashSetколекция

Класът HashSetе типична колекция от комплекти. В много отношения той е подобен на ArrayListкласа. В някои отношения това е по-примитивна version.

Можете да създадете HashSetобект, като използвате израз като:

HashSet<Type> name = new HashSet<Type>();

Къде Typeе типът на елементите, които ще съхраняваме в HashSetколекцията.

Класът HashSetима методи като този:

Метод Описание
void add(Type value)
Добавя valueелемента към колекцията
boolean remove(Type value)
Премахва valueелемента от колекцията.
Връща, trueако е имало такъв елемент
boolean contains(Type value)
Проверява дали колекцията има valueелемент
void clear()
Изчиства колекцията, като премахва всички елементи
int size()
Връща броя на елементите в колекцията

Ето пример за използване на набор.

Нека напишем програма, която казва сбогом на потребителя, ако той or тя каже здравей. За да стане по-интересно, ще дадем на нашата програма възможността да разбира „здравей“ на няколко езика.

Код Забележка
HashSet<String> set = new HashSet<String>();

set.add("Hello");
set.add("Hello");
set.add("Hola");
set.add("Bonjour");
set.add("Ciao");
set.add("Namaste");

Scanner console = new Scanner(System.in);
String str = console.nextLine();

if (set.contains(str))
   System.out.println("Goodbye!");
Създайте HashSetобект, който съхранява Stringелементи.


Добавяме поздрави на различни езици към setпроменливата.




Прочетете ред от конзолата.


Ако низът е в нашия набор от поздрави, тогава се сбогуваме.


3. Комплект

Колекцията Setе проектирана да съдържа набор от елементи. Ето защо се нарича Set(комплект). Тази колекция има три функции.

Операции върху множество

Има само три неща, които можете да направите с набор: да добавите елементи към набора, да премахнете елементи от набора и да проверите дали наборът съдържа определен елемент. Това е.

Без ред

Елементите в тази колекция нямат индекси. Не можете да получите елемент чрез индекс or да запишете стойност в колекция на конкретен индекс. Наборът няма методи get()и set().

Уникални елементи

Всички елементи в комплекта са уникални. За разлика от списъка, наборът може да съдържа само едно копие на елемент. Обектът or е в комплекта, or не — трета опция няма. Не можете да добавите черно три пъти към набор от цветове. Или го има, or го няма.

Намиране на елементи

Когато добавите нов елемент, премахнете елемент or проверите дали елемент съществува в набор, търсенето на елемента се извършва в метода. Преданият елемент се сравнява с елементите на колекцията първо от hashCode(), а след това, ако стойностите, върнати от hashCode()съвпадат, от equals().



4. Сравняване на колекции: ListvsSet

Нека сравним два вида колекции: Listи SetЩе разгледаме основните разлики, когато едната е по-изгодна от другата и обратното.

Нека се опитаме да сравним List и Set, използвайки играчки като пример.

Колекцията List(списък) е като набор от играчки, подредени по стената в стая за игри. Можете да добавите играчка в края на списъка. Ако наистина трябва, можете също да го поставите в средата (но някои от съществуващите играчки ще трябва да бъдат преместени).

Всяка играчка има индекс. Можете да посочите играчка по нейния индекс и също да замените играчка номер 7 с играчка номер 13. Можете да премахнете играчка номер 4 от списъка. Накрая можете да научите индекса на всяка играчка в списъка.

Колекцията Set(комплект) е по-скоро като купчина играчки в средата на пода. Можете да добавите играчка към купчината и можете да премахнете играчка от купчината. Но тези играчки нямат фиксиран индекс, свързан с тях.

Или да предположим, че избирате играчка за рождения ден на вашето дете. Първо мислите дали той вече има играчката. Всички играчки, които той вече има, образуват набор от играчки, които няма да изберете да купите.

От тази гледна точка можете да видите, че редът на играчките в набор от „вече съществуващи играчки“ няма meaning, нито дали рожденикът има два екземпляра от определена играчка. Не се интересувате от реда or номера на всяка играчка. Това, което ви интересува, е да знаете всяка уникална играчка, която съществува в комплекта.

За случаи като този се нуждаете от Setколекцията. Най-популярната му реализация е HashSetкласът.