вторник, 15 ноября 2011 г.

Коллекции. Краткий обзор

В языке Java существует довольно-таки много классов для хранения группы объектов, поэтому, чтобы не запутаться, следует разобраться, что из них и когда стоит использовать.
Начнём с такой вот хорошей таблицы:
Интерфейс Hash table реализация Resizable array реализация Tree реализация Linked list реализация Hash table + Linked list реализация
Set HashSet
TreeSet
LinkedHashSet
List
ArrayList
LinkedList
Queue


LinkedList
Map HashMap
TreeMap
LinkedHashMap


Из этой таблицы очень хорошо видны основные интерфейсы и реализации коллекций в Java. Также существуют интерфейсы SortedSet и SortedMap, имеющие только TreeSet и TreeMap реализации соответственно. Интерфейс Queue (очередь) имеет также специфическую реализацию PriorityQueue (приоритетная очередь, куча).  А теперь пройдемся по основным интерфейсам и их реализациям более подробно.
Set:
Set - есть ни что иное, как множество(логично). Хранит только уникальные значения.
HashSet  - элементы не упорядочены. Это объясняется тем, что используется хэширование для ускорения выборки. Так что используйте HashSet если порядок элементов не важен, т.к. поиск в нём самый быстрый.
LinkedHashSet - элементы хранятся в порядке добавления. Добавление элемента, эквивалентного хранящемуся во множестве, не изменяет порядка.
TreeSet - элементы упорядочены в естественном порядке.
List:
ArrayList - аналог обычного массива, но с динамически изменяемым размером. Используйте, если нужен доступ к элементу по индексу и добавление в конец списка или удаление из конца.
LinkedList - список. Используется, если необходимо добавление/удаление в произвольном месте списка. Однако поиск медленней, чем в ArrayList.
Queue:
LinkedList - очередь, на основе списка. Структура данных "очередь", работает по принципу FIFO(First-In-First-Out) - "первый пришёл - первый вышел", т.е. добавление элемента происходит в конец очереди, а выборка из начала, причем при выборке элемент удаляется.
Map:
Map - ассоциативные контейнеры. В Map'е хранится ключ и связанное с ним значение.
Характеристика реализаций аналогична множеству.
Ну и конечно же, примеры использования всего этого добра:
import java.util.*;

public class CollectionsExample {
    public static void main(String []args){
        Set<Integer> hSet = new HashSet<Integer>();
        Set<Integer> tSet = new TreeSet<Integer>();
        Set<Integer> lhSet = new LinkedHashSet<Integer>();
        Random rand = new Random(38);
        for (int i = 0; i < 10; ++i){
            int t = rand.nextInt(100);
            hSet.add(t);
            tSet.add(t);
            lhSet.add(t);
            System.out.print(t + " ");
        }
        System.out.println("\nHashSet: " + hSet);
        System.out.println("TreeSet: " + tSet);
        System.out.println("LinkedHashSet: " + lhSet);
        System.out.println("hSet.contains(25) " + hSet.contains(25));
        List<Integer> aList = new ArrayList<Integer>();
        List<Integer> lList = new LinkedList<Integer>();
        for (int i = 0; i<10; ++i){
            int t = rand.nextInt(100);
            aList.add(t);
            lList.add(t);
        }
        lList.add(2,rand.nextInt(100)); //index,element
        System.out.println("ArrayList: " + aList);
        System.out.println("LinkedList: " + lList);
        System.out.println("aList.get(4) " + aList.get(4));
        Queue<Integer> queue = new LinkedList<Integer>();
        queue.add(2); queue.add(5); queue.add(1);
        System.out.println("Queue: " + queue);
        System.out.println("queue.element() " + queue.element());
        System.out.println("Queue: " + queue);
        System.out.println("queue.remove() " + queue.remove());
        System.out.println("Queue: " + queue);
        Map<Integer,String> map = new HashMap<Integer, String>();
        map.put(1,"one");
        map.put(2,"two");
        System.out.println("HashMap: " + map);
        System.out.println("map.containsKey(1) " + map.containsKey(1));
        System.out.println("map.containsValue(\"three\") " + map.containsValue("three"));
        System.out.println("map.get(2) " + map.get(2));
    }
}

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

Отправить комментарий

Примечание. Отправлять комментарии могут только участники этого блога.