Руководство Java Collections Framework

View more categories:

1- Введение

Коллекция это стандартная идея программы и языка программирования. Приложение часто работает с коллекцией, как например коллекцией информации работников, коллекцией фото, ...Java так же как и другие языки программирования поддерживает массив (array) как самую стандартную коллекцию. Но работа с массивом в разных ситуациях не является удобной, так как время существования массива, увеличение элементов или удаление элементов очень сложно, даже нужно высоко заплатить для эффективности программы если это преднамеренно.
Изображение ниже иллюстрирует массив:

2- Первый пример

Сначала, мы выполним пример с  LinkedList, это список, количество элементов которого могут быть изменены, не имеют лимит как массив.
HelloLinkedList.java
package org.o7planning.tutorial.javacollection.helloworld;

import java.util.LinkedList;

public class HelloLinkedList {

	public static void main(String[] args) {
		// Создать объект LinkedList.
		LinkedList<String> list = new LinkedList<String>();

		// Добавить некоторые элементы в список.
		list.add("F");
		list.add("B");
		list.add("D");
		list.add("E");
		list.add("C");

		// Добавить элемент в конец списка.
		list.addLast("Z");

		// Добавить элемент в начало списка.
		list.addFirst("A");

		// Вставить элемент в позиции только с индексом 1.
		list.add(1, "A2");

		// Записать все элементы списка:
		System.out.println("Original contents of list: " + list);

		// Удалить элемент из списка
		list.remove("F");

		// Удалить элемент  в позиции только с индексом  2.
		list.remove(2);

		// Распечатаь список после удаления 2 элементов.
		System.out.println("Contents of list after deletion: " + list);

		// Удалить первый и последний элемент в списке.
		list.removeFirst();
		list.removeLast();

		// Распечать список после удаления.
		System.out.println("List after deleting first and last: " + list);

		// Получить элемент у индекса 2.
		Object val = list.get(2);

		// Перенастроить элемент у индекса 2.
		list.set(2, (String) val + " Changed");
		System.out.println("List after change: " + list);
	}

}
Результаты запуска примера:
Пример с  HashMap. Это объект содержащий пары ключей и значений (Key-Value). Например телефонная книга, где номер телефона это ключ, а информация абонента это значение. Ключи не должны совпадать.
HelloHashMap.java
package org.o7planning.tutorial.javacollection.helloworld;

import java.util.HashMap;

public class HelloHashMap {

	public static void main(String[] args) {

		// Создать объект HashMap хранящий пары, код сотрудников и зарплаты.
		// String key: Код сотрудников
		// Float value: Зарплата.
		HashMap<String, Float> salaryMap = new HashMap<String, Float>();
	 

		salaryMap.put("E01", 1000f);
		salaryMap.put("E02", 12000f);
		salaryMap.put("E03", 12300f);
		salaryMap.put("E04", 1000f);
		salaryMap.put("E05", 300.5f);
		
		// Получить зарплату сотрудника 'E02'
		Float salary= salaryMap.get("E01");
		System.out.println("Salary of employee E01 = "+ salary);
		
		// Обновить зарплату сотрудника 'E05'
		salaryMap.put("E05", 400f);
		
		System.out.println("Salary of employee E05 = "+ salaryMap.get("E05"));
		 
	}

}
Результаты запуска примера:

3- Лимиты при использовании массива - Предложение решения проблемы.

3.1- Массив - стандартный набор.

  • Массив является стандартным и знакомым.
    • хранит ссылочный вид, примитивные виды
    • int[] myArray=new int[]{1,4,3};
    • Object[] myArrayObj =new Object[]{"Object",new Integer(100)};
  • Массив имеет определенные размеры
    • Это затрудняет расширение массива
  • Элементы расставлены и ссылаются поочередно в памяти.
    • Это затрудняет удаления элемента из массива.

3.2- Удаление элемента из массива.

Элементы массива расставлены поочередно в памяти, это сложность, когда вы намеренно удаляете определенный элемент в массиве, он теряет свою очередность. Обычно, используется техника создания нового массива для хранения объектов старого массива и убрать ненужные элементы, но это снижает эффективность программы. В случае расширения массива используется индентичная техника, это создать новый массив с большим размером, потом скопировать элементы старого массива в новый массив.

Очевидно, что массив это не хороший способ для разных случаев применения.

3.3- Связанный список

Связанный список ( Linked List) это один из способов управления списка данных, который поборол недостаток массива. Конечно для управления списком в Java есть многие другие способы, например  ArrayList.

Смотрите недостатки  LinkedList:
  • Элементы в этом списке могут быть прерывисто изолированы (непостоянны) в памяти.
  • Это двустороняя связь между элементами. 
    • Каждый элемент в списке имеет ссылку к элементу напротив и к элементу сзади.
LinkedList is a two-way link.
Элемент Link это объект, содержащий данные которыми вам нужно управлять (data), и имеет 2 ссылки к элементам Link спереди и элементам Link сзади.
Like a group of people in queue, each person needs to remember two people standing right in front of and behind his/her.
Remove an element from LinkedList
Удалить элемент из LinkedList это тоже самое что убрать человека стоящего в очереди. Два человека стоящие рядом с этим  человеком должны обновить информацию людей стоящих спереди и сзади них.
Добавить элемент в LinkedList (Добавить в конец или середину списка)
Несмотря на то что мы  имеем только один пример связанного списка, он помогает нам понять больше про пакет  java.util.
Заметка: LinkedList это один из решений недостатков массива, ArrayList тоже является способом управления коллекции данных, решает ограничения массива, но способ управления данными другой.

4- Обзор Java Collections Framework

Зная ограничения сразу при версии 1.0 java добавил class java.util.Vector это class хранящий список объектов. И  java.util.Hashtable это class хранящий пары  key/value (ключ/значение) . После этого,  Java2 platform продолжил ознакомление со способами доступа к коллекция, называется  Collections Framework. java.util.Vector, java.util.Hashtable так же существует и сейчас является частью той большой платформы. Эти коллекции построены на основании некоторых интерфейсов в пакете  java.util. И разделены на 2 иерархические системы, которые лидируются с помощью 2 интерфейсов  java.util.Collection содержащие список объектов и java.util.Map содержащие пары  key/value.

4.1- Интерфейсы в Java Collections Framework

Изображение выше это важные интерфейсы  Java Collections Framework. Мы поговорим о целях использования этих интерфейсов и их группировании по целям и способам использования. В пакете ava.util class-ы применяют один или более интерфейсов. Поэтому определенный class в java.util может иметь разные функции. Например  java.util.HashMap:
** Hashtable **

public class HashMap<K,V> extends AbstractMap<K,V>
                           implements Map<K,V>, Cloneable, Serializable
** Vector **
public class Vector<E> extends AbstractList<E>
            implements List<E>, RandomAccess, Cloneable, Serializable

4.2- Две иерархии лидируемые 2 интерфейсами Collection и Map - Методы хранения данных

  • Группа Collection хранит объекты. 
    • Есть 3 подветки в группе Collection: Queue, List, Set .
    • Элементы могут быть похожими или независят от 3-х перечисленных веток. (Более детально будет обсуждено позже) .
  • Группа Map хранит пары key/value
    • Пары key/value содержащиеся в Map (карта) это всегда разные key между парами
    • Если мы знаем key, можем получить значение value в Map соответстующий с этим key.
Группа  Collection хранит данные в виде ссылки, группа  Map хранит пары  key/value.
Collection<String> c=new ArrayList<String>();
// Добавить элемент в коллекцию.
c.add("One");


Map<Integer,String> m=new LinkedHashMap<Integer,String>();
Integer key=new Integer(123);
String value="One two three";

// Добавить паку 'key/value' в Map m.
// Если 'key' уже существует, 'value' будет заменен новым значением.
m.put(key,value);

// Распечатывает значение соответствующее с 'key' (ключ).
System.out.println(m.get(new Integer(123));

4.3- Интерфейсы итератора и интерфейс RandomAccess -  Метод получения доступа к данным

  • java.util.Iterator
    • Похож на итератор для получения данных, способ запроса по очереди с одного элемента к другому.
  • java.util.RandomAccess
    • Случайный метод запроса, например для позиции элемента и получения этого элемента в наборе
    •  Например java.util.Vector применяет этот интерфейс, может получить случайный элемент vector.get(int index).
  • Группа Collection тоже может иметь доступ поочередно вызывая метод iterator() для получения объекта Iterator .
    • java.util.Collection расширен из интерфейса java.lang.Iterable (может повториться) поэтому унаследовал метод public Iterator<E> iterator().
На иллюстрации выше имеется 2 Interface Iterator & RandomAccess, он представляет 2 способа доступа в элементы коллекции.
Просмотр класса  Vector:
** Vector **
public class Vector<E> extends AbstractList<E>
               implements List<E>, RandomAccess, Cloneable, Serializable
Vector принадлежит группе  Collection, вы можете получить доступ к ее элементам через  Iterator и можно получить случайный доступ через метод  get(index).

Заметка: Для объектов в группе List вы так же можете получить объект  ListIterator, этот итератор позволяет вам переместить назад или вперед позицию курсора на списке, вместо того чтобы перемещать только вперед как в  Iterator.

5- Collection Group

5.1- Interfaces в группе Collection

3 прямых подинтерфейса в  Collection это  Queue, List, Set при этом  Queue добавлен из версии 1.5 и считается ожидающимся в очереди. Queue так же имеет подинтерфейс это  BlockingQueue, этот интерфейс принадлежит пакету java.util.concurrent, мы не будет обсуждать это в данной статье. Queue это интерфейс с разными понятиями и способов организации элементов, которым нужно больше всего внимания. Три интерфейса  Queue , List , Set можно считать 3-мя ветками в группе  Collection , перед тем как перейти к деталям каждой группы посмотрим обзор интерфейса  Collection.

5.2- java.util.Collection Interface

Наследственная связь:
** java.util.Collection **
public interface Collection<E> extends java.lang.Iterable<E> {

   //
   // Add element to collection
   // return true if this collection changed as a result of the call
   //
   boolean add(E o);

   //
   // Adds all of the elements in the specified collection to this collection.
   // return true if this collection changed as a result of the call
   //
   boolean addAll(Collection<? extends E> c);

   // Removes all of the elements from this collection (optional operation).
   // The collection will be empty after this method returns.
   void clear();

   // Returns true if this collection contains the specified element.
   boolean contains(Object o);

   // Returns true if this collection contains all of the elements
   // in the specified collection.
   boolean containsAll(Collection<?> c);

   // Compares the specified object with this collection for equality
   boolean equals(Object o);

   int hashCode();

   // Returns true if this collection contains no elements.
   boolean isEmpty();

   //
   // Removes a single instance of the specified element from this
   // collection, if it is present (optional operation).
   //
   boolean remove(Object o);

   // Removes all of this collection's elements that are also contained in the
   // specified collection (optional operation)
   boolean removeAll(Collection<?> c);

   //
   // Retains only the elements in this collection that are contained in the
   // specified collection (optional operation)
   //
   boolean retainAll(Collection<?> c);

   // Returns the number of elements in this collection
   int size();

   // Returns an array containing all of the elements in this collection
   Object[] toArray();

   <T> T[] toArray(T[] a);

   // Returns an iterator over the elements in this collection.
   Iterator<E> iterator();
}

5.3- Получить доступ к элементам коллекции

Iterator это способ утверждения над элементами коллекции.
Например использовать  Iterator для получения доступа к элементам  Collection.
 
CollectionAndIterator.java
package org.o7planning.tutorial.javacollection.collection;

import java.util.Collection;
import java.util.Iterator;
import java.util.Vector;

public class CollectionAndIterator {

	public static void main(String[] args) {

		// Создать пустой объект Collection.
		// Создать коллекцию содержащую только String.
		Collection<String> coll = new Vector<String>();
		coll.add("Collection");
		coll.add("Queue");
		coll.add("List");
		coll.add("Map");

		// Распечатать количество элементов данной коллекции (collection).
		System.out.println("Size:" + coll.size());

		// Получить объект Iterator для получения доступа в элементы коллекции.
		// Этот объект Iterator содержит только String.
		Iterator<String> ite = coll.iterator();

		// Проверить имеет ли Iteractor следующие элементы или нет?
		while (ite.hasNext()) {
			// Получить элементы в позиции курсора
			// Потом переместить курсор на 1 шаг.
			String s = ite.next();
			System.out.println("Element:" + s);
		}
	}

}
Результаты запуска примера:

5.4- Подветка Collection

Как упомянуто выше,  Collection имеет 3 подинтерфейса это  Queue , List и Set. И разница между ними это способ хранения данных.
java.util.Queue java.util.List java.util.Set
Разрешает содержать дублированные элементы Разрешает содержать дублированные элементы Не разрешает содержать дублированные элементы
Не разрешает содержать элементы null Разрешает содержать один или более элементы null Смотря по классу, выполняет Set поддерживающий элементы null или нет. Если поддерживает, то содержит только один элемент null 

List

Список ( List) это упорядоченный список объектов, там где одинаковые объекты могут появиться один или много раз. Например: [1, 7, 1, 3, 1, 1, 1, 5]. И вы можете сказать про "номер N" в списке. Вы можете добавить элемент в любую позицию в списке, изменить элемент в любой позиции в списке, или удалить элемент из любой позиции в списке,

Queue

Очередь ( Queue) это тоже упорядоченный набор, но вы можете только прикоснуться к элементам в начале очереди. Все элементы вставленные в конце очереди и удалить первые элементы в очереди. Вы можете узнать сколько элементов в очереди, но вы не можете найти или сказать про элемент N, вы можете увидеть только когда он станет первым в очереди.

Set

Set это неупорядоченный набор, и не позволяет содержать дубликаты. Вы не може сказать про N-ый элемент и даже про первый элемент, так как он не имеет порядок. Вы можете добавить или удалить элементы, и можете найти если элемент существует (Например "Находится ли 7 в данном наборе?").

Примечание: SortedSet это подинтерфейс  Set который может содержать элементы, имеющие порядок.

5.5- java.util.List Interface

List это подинтерфейс в  Collection который имеет полные функции  Collection так же имеет некоторый особенный функции:
  • Позволяет дублирование элементов
  • Позволяет сущетвовать 0 или более элементов null.
  • Это набор с последовательностью
Помимо доступа, используя  Iterator можно получить доступ используя  ListIterator. ListIterator позволяет перемещать позицию курсора вперед или назад.
// Возвращает объект ListIterator, чтобы просмотреть элементы списка.
public ListIterator<E> listIterator()  
 
// Возвращает объект ListIterator,
// для просмотра элементов с позиции с 'index' до конца списка.
public ListIterator<E> listIterator(int index)
ListAndListIterator.java
package org.o7planning.tutorial.javacollection.list;

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListAndListIterator {

	public static void main(String[] args) {

		// Создать объект List (Содержащий только String).
		List<String> list = new ArrayList<String>();
		list.add("One");
		list.add("Two");
		list.add("Three");
		list.add("Four");

		// Получить объект ListIterator для просмотра элементов списка.
		// (Theo đúng trình tự).
		// Возвращает список iterator элементов данного списка
		// (в определенном порядке)
		ListIterator<String> listIterator = list.listIterator();

		// В данный момент курсор стоит на первой позиции Iterator.
		// Стоит в позиции с индексом 0.
		// Получить первый элемент в Iterator, курсор движется вперед на один шаг.
		String first = listIterator.next();
		System.out.println("first:" + first);// -->"One"

		// В данный момент курсор стоит в позиции с индексом 1.
		// Получить следующий элемент.
		String second = listIterator.next();
		System.out.println("second:" + second);// -->"Two"

		// Проверить может ли курсор перепрыгнуть назад на 1 позицию или нет.
		if (listIterator.hasPrevious()) {
			// Перепрыгнуть назад на 1 шаг.
			String value = listIterator.previous();
			System.out.println("value:" + value);// -->"Two"
		}

		System.out.println(" ----- ");

		while (listIterator.hasNext()) {
			String value = listIterator.next();
			System.out.println("value:" + value);
		}
	}

}
Результаты запуска примера:

5.6- java.util.Set Interface

Set это подинтерфейс в Collection, который имеет полные функции  Collection, и имеет некоторые другие функции:
  • Описывает набор который не позволяет содержать дублированные элементы
  • Позволяет существование элемента null, если есть элемент null то только 1.
HashSetExample.java
package org.o7planning.tutorial.javacollection.set;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class HashSetExample {

	public static void main(String[] args) {

		// Создать объект Set с начальной емкостью (capacity) способной содержать 10 элементов.
		// Если количество добавленных элементов превышает настоящую емкость, он повысит ее на 80%.
		// Особенностью HashSet является - добавленные элементы после будут стоять спереди.
		Set<String> set = new HashSet<String>(10, (float) 0.8);

		set.add("One");
		set.add("Two");

		// Когда происходит дупликация.
		// С HashSet: Он добавит новый элемент и удалит старый элемент.
		set.add("One");
		set.add("Three");

		Iterator<String> it = set.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
	}

}
Результаты запуска примера:

5.7- java.util.Queue Interface

Queue (очередь) это подинтерфейс в  Collection, который имеет полные функции  Collection, довольно похож на  List, при этом цель использования отличается. Queue разработан чтобы вы могли получить доступ к первому элементу в очереди, и при удалении элементов, он удаляет певый элемент в очереди. Похож на очередь в супермаркете, только первый человек в очереди обслуживается, новый человек будет помещен в очередь, позиция помещения может быть не в конце. Позиция помещенного элемента зависит от вида очереди и приоритет элемента.
  • Это коллекция позволяющия элементам дублироваться.
  • Не позволяет существовать элементам null.
Есть два класса применяющих интерфейс  Queue.
  • java.util.LinkedList
  • java.util.PriorityQueue
LinkedList это стандартная очередь. Но помните, что LinkedList применяет оба интерфейса  List и Queue.

PriorityQueue хранит элементы внутри по естественному порядку элементов (если эти элементы вида  Comparable), или в соответствии с  Comparator настроенный для  PriorityQueue.
Заметьте, что один class может применить оба интерфейса  List и Queue, поэтому вам не нужно обращать внимания на то, как элементы расставлены внутри объекта класса выше, если вы считаете его очередью, смотрите как получить доступ к элементам в очереди. Смотрите типичные методы  Queue, он симулирует очередь как линию очереди людей в супермаркете.
  Throws exception Returns special value
Insert add(e) offer(e)
Remove remove() poll()
Examine element() peek()

boolean add(E)

Вставляет определенный элемент в очередь если это возможно сделать сразу без лимита из-за размера очереди, возвращает  true если успешно, напротив выбрасывает исключения  IllegalStateException если в очереди больше нет места.

boolean offer(E)

Вставляет элемент в очередь, если возможно это сделат сразу, если нет лимита из-за размера очереди. При использовании очереди с ограниченным размером, это метод довольно похож на add(E), при этом этот метод не выбрасывает исключения если не может вставить элемент в очередь, а возвращает в том случае false.

E remove()

Получает и удаляет первый элемент из очереди. Этот метод отличается от poll() только в том, что выбрасывает исключение, если в очереди нет элементов.

E poll()

Получаете и удаляет первый элемент в очереди, или возвращает null если в очереди нет элементов.

E element()

Получает, но не удаляет первый элемент в очереди. Этот метод отличается от peek(), в том что выбрасывает исключение если в очереди нет элементов. 

E peek()

Получает, но не удаляет первый элемент в очереди, или возвращает null если в очереди нет элементов.

Комментарии:

Среди методов очереди нет такого метода, который позволил бы вам получить доступ к другим элементам в очереди, за исключением первого элемента, вы так же не може указывать местонахождение элемента, который будет вставлен.
QueueDemo.java
package org.o7planning.tutorial.javacollection.queue;

import java.util.LinkedList;
import java.util.Queue;

public class QueueDemo {

	public static void main(String[] args) {

		Queue<String> names = new LinkedList<String>();

		// offer(E): Вставляет дополнительно элемент в очередь (queue).
		// С очередью LinkedList элемент будет вставлен в конце очереди.
		// Возвращает true если вставлено успешно.
		// Возвращает false если в очереди больше нет места.
		names.offer("E");
		names.offer("A");
		names.offer("M");

		// add(E):  Вставляет дополнительно элемент в очередь.
		// С очередью LinkedList элемент будет вставлен в конце очереди.
		// Возвращает true если вставлено успешно.
		// Выбрасывает исключение если в очереди больше нет места.
		names.add("G");
		names.add("B");

		while (true) {
			// Получает и удаляет первый элемент из очереди.
			// Возвращает null если большне нет элементов в очереди.
			String name = names.poll();
			if (name == null) {
				break;
			}
			System.out.println("Name=" + name);
		}

	}

}
Результаты запуска примера:
Например, с очередью приоритетов  PriorityQueue. Эта очередь хранит элементы внутри в соответствии с естественным порядком (если эти элементы сравниваются друг с другом - применяя  Comparable) или в соответствии с  Comparator настроенный для  PriorityQueue.
String это класс применяющий интерфейс  Comparable, они могут сравниваться друг с другом, и расставлены по порядку алфавита.
PriorityQueueDemo.java
package org.o7planning.tutorial.javacollection.queue;

import java.util.PriorityQueue;
import java.util.Queue;

public class PriorityQueueDemo {

	public static void main(String[] args) {

		// С очередью(queue) PriorityQueue элемент будет распределен по естественному порядку.
		Queue<String> names = new PriorityQueue<String>();

		// offer(E): Вставляет дополнительно элемент в очередь (queue).
		// Возвращает true если добавлен успешно.
		// Возвращает  false если нет больше места.
		names.offer("E");
		names.offer("A");
		names.offer("M");

		// add(E): Вставляет дополнительно элемент в очередь (queue).
		// Возвращает true если добавлен успешно.
		// Выбрасывает Exception если очередь заполнена.
		names.add("G");
		names.add("B");

		while (true) {
			// poll(): Получить и удалить первый элемент из очереди.
			// Возвращает null если больше нет элементов в очереди.
			String name = names.poll();
			if (name == null) {
				break;
			}
			System.out.println("Name=" + name);
		}

	}

}
Результаты запуска примера:

5.8- Наследственные отношения между классами в группе Collection

Некоторые стандартные классы:
 
Implementations
Hash Table Resizable Array Balanced Tree Linked List Hash Table + Linked List
Interfaces Set HashSet   TreeSet   LinkedHashSet
List   ArrayList      

5.9- java.util.ArrayList

ArrayList имеет полные функции интерфейса  List. Одновременно, имеет возможность получать доступ к случайным элементам (Из-за наследства от интерфейса  RandomAccess)
Это в принципе похоже на класс  Vector, отличается в том, что метод  Vector синхронизирован, а ArrayList нет. ArrayList подходит для одноточного приложения (1 Thread).
ArrayListDemo.java
package org.o7planning.tutorial.javacollection.list;

import java.util.ArrayList;

public class ArrayListDemo {

	public static void main(String[] args) {

		// Объявить объект ArrayList содержаций элемент вида Integer.
		ArrayList<Integer> list = new ArrayList<Integer>(10);

		// Добавить элементы.
		list.add(123);
		list.add(245);
		list.add(new Integer(345));

		// ArrayList позволяет добавить элементы null .
		// (Особенность List)
		list.add(null);

		// Распечатаь элементы ArrayList.
		System.out.println("Size:" + list.size());// =4

		// Получить случайный доступ в элемент индекса 1.
		Integer i = list.get(1);
		System.out.println("Element index 1 =" + i);// =245
		Integer newInt = 1000;

		// Заменить элемент в позиции с индексом 1.
		// Этот метод возвращает старый элемент.
		Integer old = list.set(1, newInt);
		// 
		System.out.println("Old value:" + old);// =245 .
		System.out.println("New value:" + list.get(1));// =1000 .
	}

}
Результаты запуска примера:

5.10- java.util.Vector

Vector это класс имеющий функции похожие на  ArrayList. Отличие в том, что методы  Vector синхронизированы, а в  ArrayList нет.


 
Методы  Vector синхронизированы, поэтому они хорошо работают в многопоточных приложениях (Multiple Thread)
Vector имеет некоторые методы, которые были унаследованы от версии 1.0. Перед тем как понятие Collection Framework  было упомянуто в Java.
// Legacy method from 1.0, get element at index position
// Like get(index)
public E elementAt(int index)


// Method inherited from the List interface, get element at position index.
public E get(int index)

// Replaces the element at the specified position in this list with the specified element
// Return old element.
// setElementAt(int,E) like set(int,E)
public void setElementAt(int index, E element);

// Replaces the element at the specified position in this list with the specified element
// Return old element.
public E set(int index, E element)
VectorDemo.java
package org.o7planning.tutorial.javacollection.list;

import java.util.Vector;

public class VectorDemo {

	public static void main(String[] args) {
		// Создать объект Vector.
		// С начальной емкостью (capacity) 10 элементов.
		// Автоматически увеличить емкость еще на 5 если 
		// количество элементов больше, чем емкость на данный момент
		Vector<Integer> v = new Vector<Integer>(10, 5);

		v.add(123);
		v.add(245);
		v.add(new Integer(345));
		v.add(null);

		// Напечатать реальное количество элементов, 
		// содержащиеся в Vecter (Не емкость)
		System.out.println("Size:" + v.size());// =4

		// Получить элемент в индексе 1.
		// Похоже на метод get(int).
		Integer i = v.elementAt(1);
		System.out.println("v.elementAt(1)=" + i);// 245

		// Заменить элемент в индексе 1.
		v.setElementAt(1, 1000);
		// 
		System.out.println("New value:" + v.get(1));// =1000 .
	}
}
Результаты запуска примера:

5.11- java.util.SortedSet

SortedSet это подинтерфейс интерфейса  Set, который имеет полные функции  Set. SortedSet это категория наборов с расстановкой, добавленные новые элементы в категорию набора автоматически стоят на подходящем месте, чтобы удостовериться, что набор расставлен (по возрастанию или убыванию)

Поэтому элементы набора должны сравниваться друг с другом, они должны быть объектами  java.lang.Comparable (Могут быть сравнены), Если вы добавляете элемент который не является объектом Comparable, вы получите исключение.
Один из классов, применяющих интерфейс  SortedSet это  TreeSet.
Будем считать класс  Player (Игрок), включает информацию: имя, фамилия, количество золотых медалей, количество серебряных медалей, количество бронзовых медалей.

Игроки ( Player) можно сравнивать друг с другом по правилу:
  1. У кого больше золотых медалей будет иметь позицию выше.
  2. Если у двух человек количество золотых медалей равно, то у кого будет больше серебряных медалей, имеет позицию выше.
  3. Если у двух человек количество золотых серебряных медалей равно, то у кого будет больше бронзовых медалей, имеет позицию выше.
  4. Остальные будут считаться равными.
Class Player будет применять интерфейс  java.lang.Comparable.
Player.java
package org.o7planning.tutorial.javacollection.sortedset;

public class Player implements Comparable<Player> {

	private String name;

	private int goldMedal;
	private int silverMedal;
	private int bronzeMedal;

	public Player(String name, int goldMedal, int silverMedal, int bronzeMedal) {
		this.name = name;
		this.goldMedal = goldMedal;
		this.silverMedal = silverMedal;
		this.bronzeMedal = bronzeMedal;
	}

	// Сравнить данный Player с другим Player.
	// Возвращает значение < 0, то есть данный Player  < Player other.
	// Если возвращает значение > 0, значит данный Player > Player other
	// Если возвращает значение = 0, значит данный Player này = Player other.
	@Override
	public int compareTo(Player other) {
		// Сравнить количество золотых медалей.
		int value = this.goldMedal - other.goldMedal;
		if (value != 0) {
			return value;
		}
		// Сравнить количество серебряных медалей
		value = this.silverMedal - other.silverMedal;
		if (value != 0) {
			return value;
		}
		// Сравнить количество бронзовых медалей
		value = this.bronzeMedal - other.bronzeMedal;
		return value;
	}

	@Override
	public String toString() {
		return "[" + this.name + ", Gold: " + this.goldMedal //
				+ ", Silver: " + this.silverMedal + ", Bronze: " //
				+ this.bronzeMedal + "]";
	}

}
SortedSetDemo.java
package org.o7planning.tutorial.javacollection.sortedset;

import java.util.SortedSet;
import java.util.TreeSet;

public class SortedSetDemo {

	public static void main(String[] args) {

		// Создать объект SortedSet через подкласс TreeSet
		SortedSet<Player> players = new TreeSet<Player>();

		Player tom = new Player("Tom", 1, 3, 5);
		Player jerry = new Player("Jerry", 3, 1, 3);
		Player donald = new Player("Donal", 2, 10, 0);

		// Добавить элементы в коллекцию.
		// Они будут автоматически расставлены (По возрастанию).
		players.add(tom);
		players.add(jerry);
		players.add(donald);

		// Напечатать элементы.
		for (Player player : players) {
			System.out.println("Player: " + player);
		}
	}

}
Результаты запуска класса  SortedSetDemo:

6- Группа Map

6.1- Interfaces в группе Map

Группа  Map лидируется интерфейсом java.util. Map.  Этот интерфейс имеет 2 подинтерфейса  java.util.SortedMap и java.util.concurrent. ConcurrentMap . ConcurrentMap не принадлежит пакету  java.util он был представлен с версии java1.5, мы не будем ссылаться об этом в данной статье. Группа  Map характеризуется хранением данных через пары key/value.

6.2- Классы в группе Map

6.3- java.util.Map Interface

SN Methods with Description
1 void clear( )

Removes all key/value pairs from the invoking map.(optional operation).

2 boolean containsKey(Object k)

Returns true if the invoking map contains k as a key. Otherwise, returns false.

3 boolean containsValue(Object v)

Returns true if the map contains v as a value. Otherwise, returns false

4 Set<Map.Entry<K,V>> entrySet( )

Returns a Set that contains the entries in the map. The set contains objects of type Map.Entry. This method provides a set-view of the invoking map.

5 boolean equals(Object obj)

Returns true if obj is a Map and contains the same entries. Otherwise, returns false.

6 Object get(K k)

Returns the value associated with the key k.

7 int hashCode( )

Returns the hash code for the invoking map.

8 boolean isEmpty( )

Returns true if the invoking map is empty. Otherwise, returns false.

9 Set<K> keySet( )

Returns a Set that contains the keys in the invoking map. This method provides a set-view of the keys in the invoking map.

10 Object put(K k, V v)

Puts an entry in the invoking map, overwriting any previous value associated with the key. The key and value are k and v, respectively. Returns null if the key did not already exist. Otherwise, the previous value linked to the key is returned.(optional operation).

11 void putAll(Map<? extends K,? extends V> m)

Puts all the entries from m into this map.(optional operation).

12 Object remove(Object k)

Removes the entry whose key equals k. (optional operation).

13 int size( )

Returns the number of key/value pairs in the map.

14 Collection values( )

Returns a collection containing the values in the map. This method provides a collection-view of the values in the map.

Необязательные методы (Optional operation) может поддерживаться  на применяемом классе или нет, в случае если не поддерживается, то может выбросить исключение  UnsupportedOperationException:
import java.util.Collection;
import java.util.Map;
import java.util.Set;

public class MyMap<K,V> implements Map<K,V>{

   .....
     
     // Если вы вызываете этот метод, выбросится исключения без условий.
    @Override
    public void clear() {
        throw new java.lang.UnsupportedOperationException();        
    }  

}
Но класс  MyMap не поддерживает действительный смысл метода clear(). Если пользователь намеренно использует этот метод  MyMap то получит исключение.
MapDemo.java
package org.o7planning.tutorial.javacollection.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;

public class MapDemo {

	public static void main(String[] args) {

		Map<String, String> map = new HashMap<String, String>();

		map.put("01000005", "Tom");
		map.put("01000002", "Jerry");
		map.put("01000003", "Tom");
		map.put("01000004", "Donald");

		// Получить набор содержащий ключи (key).
		// Этот набор не будет расспределен.
		Set<String> phones = map.keySet();

		for (String phone : phones) {
			System.out.println("Phone: " + phone + " : " + map.get(phone));
		}

	}

}
Результаты запуска:
Вы можете получить доаступ данных Map через  Map.Entry, смотрите иллюстрацию ниже:
MapEntryDemo.java
package org.o7planning.tutorial.javacollection.map;

import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.Map.Entry;

public class MapEntryDemo {

	public static void main(String[] args) {

		Map<String, String> map = new HashMap<String, String>();

		map.put("01000005", "Tom");
		map.put("01000002", "Jerry");
		map.put("01000003", "Tom");
		map.put("01000004", "Donald");

		// Получить набор entry.
		// Эти entry могут быть не расспределены по ключам (key).
		Set<Entry<String, String>> entries = map.entrySet();

		for (Entry<String, String> entry : entries) {
			System.out.println("Phone: " + entry.getKey() + " : " + entry.getValue());
		}

	}
}
Результаты запуска примера:

6.4- java.util.SortedMap Interface

Interface SortedMap это подинтерфейс  Map. Он гарантирует, что пары key/value расставлены по порядку возрастания в соответствии с key.
Есть только один класс в пакете java.util который применяет интерфей  SortedMap, это  TreeMap.
Это методы  SortedMap:
SN Methods with Description
1 Comparator comparator( )

Returns the invoking sorted map's comparator. If the natural ordering is used for the invoking map, null is returned.

2 Object firstKey( )

Returns the first key in the invoking map.

3 SortedMap headMap(Object end)

Returns a sorted map for those map entries with keys that are less than end.

4 Object lastKey( )

Returns the last key in the invoking map.

5 SortedMap subMap(Object start, Object end)

Returns a map containing those entries with keys that are greater than or equal to start and less than end

6 SortedMap tailMap(Object start)

Returns a map containing those entries with keys that are greater than or equal to start.

SortedMapDemo.java
package org.o7planning.tutorial.javacollection.sortedmap;

import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

public class SortedMapDemo {

	public static void main(String[] args) {

		Map<String, String> map = new TreeMap<String, String>();

		map.put("01000005", "Tom");
		map.put("01000002", "Jerry");
		map.put("01000003", "Tom");
		map.put("01000004", "Donald");

		// Этот набор расспределен по возрастанию.
		Set<String> keys = map.keySet();
		for (String key : keys) {
			System.out.println("Phone: " + key);
		}

		System.out.println("-----");

		// Этот набор так же расспределен по key.
		Set<Map.Entry<String, String>> entries = map.entrySet();
		for (Map.Entry<String, String> entry : entries) {
			System.out.println("Phone: " + entry.getKey());
		}
	}

}
Результаты запуска примера:

View more categories: