Содержание
Эта статья является первой из серии статей о коллекциях в 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. Все коллекции унаследованы от одного интерфейса 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
Стоит заметить, что в Java нет ни одного класса, который напрямую реализует интерфейс Collection. Это происходит через промежуточные интерфейсы List, Set и Queue.
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 | > |