Коллекции (Collections) в Java. Введение

августа
07
2012
Метки: collection java

Содержание

Эта статья является первой из серии статей о коллекциях в Java. В будущих статьях будет рассмотрены основные классы-коллекции, появившиеся в Java 1.5. Будут рассмотрены классы, унаследованные от Set, List, Queue и Map: ArrayList, HashSet, EnumSet, LinkedHashSet, LinkedList, PriorityQueue, TreeSet, HashMap, LinkedHashMap, TreeMap и другие.

Немного истории

До появления версии 1.5 в Java были только 3 типа коллекций: массивы, Vector (и унаследованный от него Stack) и Hashtable.

До Java 1.4 включительно Vector представлял собой очередь, в которую можно было добавлять объект любого класса. Он представлял простой способ работы с цепочкой элементов. Так как типизированные коллекции появились только в 5-й версии Java, то программисты нередко использовали Vector для хранения объектов разных классов из-за простоты использования. Конечно, и в 5-й версии Java, можно создать любую коллекцию, которая будет хранить объекты класса java.lang.Object, но это делать строго не рекоммендуется. В Java 1.5 Vector стал типизированным как и остальные классы коллекций.

Hashtable - коллекция, позволяющая хранить данные в виде ключ-значение. Иногда Hashtable сравнивают (и приравнивают) с ассоциативными массивами из других языков программирования. Ключ и значение могут быть любым объектом, но не примитивом. Также, ключ в Hashtable не может быть null.

До Java 1.4 в Vector и Hashtable нельзя было добавлять примитивные типы, такие как: int, float, long, double. Для создания списка примитивных объектов необходимо было использовать оболочки для примитивных типов: Integer, Float, Long, Double. С выходом Java версии 1.5, в Vector и Hashtable можно добавлять примитивные типы. Они будут автоматически преобразованы в свои обертки.

Vector и Hashtable были и остаются синхронизированными из-за чего операции с ними занимают больше времени, чем с аналогичными классами List и Map. Vector и Hashtable - устаревшие классы, которые не рекоммендуется использовать.

Коллекции в Java 1.5

Перейдем непосредственно к коллекциям, которые появились в Java 1.5. Все коллекции унаследованы от одного интерфейса Collection из пакета java.util. Интерфейс Collection, в свою очередь, реализует интерфейс Iterable. Это означает, что все классы, унаследованные от Collection могут использоваться в цикле foreach. Например так:


List<String> stringList = Arrays.asList("1", "2", "4", "3");
for( String entry : stringList ){
	System.out.println( entry );
}

Учтите, что удаление элементов из коллекции в цикле foreach небезопасно. Для этих целей используйте итератор, например так:


for (Iterator<?> it = c.iterator(); it.hasNext(); )
	if (!cond(it.next()))
		it.remove();

Иерархия интерфейсов, унаследованных от Collection представлена на Рис.1. Как можно заметить, отсутствует интерфейс Map - он не унаследован от Collection и о нём разговор будет отдельный.

Рис 1. Collections в Java
Рис 1. Коллекции (Collections) в Java

Стоит заметить, что в Java нет ни одного класса, который напрямую реализует интерфейс Collection. Это происходит через промежуточные интерфейсы List, Set и Queue.

Общепринятые правила использования Collection

1. Всегда корректно описывайте методы equals() и hashCode() в объектах, которые будут добавлены в коллекцию. Например, для того, чтобы метод contains(Object o) вернул корректное значение, необходимо чтобы выполнялось следующее условие: (o==null ? e==null : o.equals(e)). Метод hashCode() гарантирует, что два объекта с разными значениями hashCode() не могут быть равны. Также метод hashCode() может использоваться коллекцией для наиболее эффективного размещения объектов в памяти. Это правило не касается стандартных типов вроде String, Integer, Float и т.д. так как в этих классах уже реализованы оба метода.

2. Каждый класс, реализующий интерфейс Collection, имеет как минимум два конструктора: конструктор по умолчанию и конструктор, принимающий коллекцию (объект Collection). Это правило ложиться на плечи разработчика так как у интерфейсов не может быть конструкторов. Пример:


List<String> stringList = Arrays.asList( "2", "1", "2", "4", "3");
Set<String> stringSet = new HashSet<String>( stringList );
for( String entry : stringSet ){
	System.out.print( entry );
}
// Output: 3214

3. Класс реализует интерфейс Collection и если метод не поддерживается коллекцией, то необходимо генерировать исключение UnsupportedOperationException. Это является необязательным правилом. Например, если коллекция не может быть модифицирована, то при вызове метода add() может произойти исключение UnsupportedOperationException, а может и не произойти если это не критично.

Основные преимущества использования коллекций

Коллекции (Collections) в Java. List >

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии