Инструменты пользователя

Инструменты сайта


java_collections

Назад

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

  • Добавление нового элемента в коллекцию;
  • Элемент ненумерованного спискаудаление элемента из коллекции;
  • Изменение элемента в коллекции.

Интерфейсы и классы коллекций

Java Collections Framework основана на конкретных реализациях нескольких интерфейсов, определяющих тип коллекций:

  • Интерфейс List определяет коллекцию элементов Object, по которой можно перемещаться.
  • Интерфейс Set определяет коллекцию без дублирующих элементов.
  • Интерфейс Map определяет коллекцию пар ключ-значение.

Интерфейс Реализация (реализации)

List ArrayList, LinkedList
Set HashSet, TreeSet
Map HashMap

Все интерфейсы библиотеки, кроме Map, являются субинтерфейсами интерфейса Collection, который определяет самую общую структуру коллекции. Каждая коллекция состоит из элементов.

Каждая коллекция состоит из элементов. Как субинтерфейсы Collection, все коллекции имеют некоторое общее поведение:

  • Методы, описывающие размер коллекции (такие как size() и isEmpty()).
  • Методы, описывающие содержимое коллекции (такие как contains() и containsAll()).
  • Методы, поддерживающие управление содержимым коллекции (такие как add(), remove() и clear()).
  • Методы, позволяющие преобразовать коллекцию в массив (такие как toArray()).
  • Метод, позволяющий получить итератор массива (iterator()).

Реализации List

ArrayList

ArrayList – динамический массив с произвольной вставкой и удалением элементов.

java.util.ArrayList этот класс расширяет AbstractList и весьма похож на класс Vector. Он также динамически расширяется, как Vector, однако его методы не являются синхронизированными, вследствие чего операции с ним выполняются быстрее.

import java.util.ArrayList;
import java.util.Iterator;
 
public class Main 
{
    public static void main(String[] args)
    {
        ArrayList <String> l = new ArrayList();
        l.add("qwe");
        l.add("asd");
        l.add("zxc");
 
        //Итератор
        Iterator it = l.iterator();
        for(Iterator <String> iter = it; iter.hasNext();)
        {
            String str = iter.next();
            System.out.println(str);
        }
    }
}

Для того, чтобы воспользоваться синхронизированной версией ArrayList, можно применить вот такую конструкцию:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
 
public class Main 
{
    public static void main(String[] args)
    {
        List <String> l = Collections.synchronizedList(new ArrayList());
        l.add("qwe");
        l.add("asd");
        l.add("zxc");
        //Итератор
        Iterator it = l.iterator();
        for(Iterator <String> iter = it; iter.hasNext();)
        {
            String str = iter.next();
            System.out.println(str);
        }
    }
}

LinkedList

java.util.LinkedList представляет собой реализацию интерфейса List. Он реализует все методы интерфейса List, помимо этого добавляются еще новые методы, которые позволяют добавлять, удалять и получать элементы в конце и начале списка. LinkedList является двухсвязным списком и позволяет перемещаться как от начала в конец списка, так и наоборот. LinkedList удобно использовать для организации стека.

import java.util.LinkedList;
import java.util.Iterator;
public class Main 
{
    public static void main(String[] args)
    {
        LinkedList <String> l = new LinkedList();
        l.add("qwe");
        l.add("asd");
        l.add("zxc");
 
        //Итератор
        Iterator it = l.iterator();
        for(Iterator <String> iter = it; iter.hasNext();)
        {
            String str = iter.next();
            System.out.println(str);
        }
    }
}

Классы LinkedList и ArrayList имеют схожую функциональность. Однако с точки зрения производительности они отличаются. Так, в ArrayList заметно быстрей (примерно на порядок) осуществляются операции прохода по всему списку (итерации) и получения данных. LinkedList почти на порядок быстрее выполняет операции удаления и добавления новых элементов.
Также у LinkedList есть методы добавление данных первым и последним элементом.

Реализации Set

Данные интерфейсы предназначены для работы с множествами (т.е. в коллекции не может быть два одинаковых элемента).

HashSet

HashSet хранит элементы в случайном (на первый взгляд) порядке. Дело в том, что для быстрого поиска HashSet расчитывает для каждлого элемента hashCode и именно по этому ключу ищет и упорядочивает элементы внутри себя.

import java.util.HashSet;
import java.util.Iterator;
public class Main 
{
    public static void main(String[] args)
    {
        HashSet <String> l = new HashSet();
        l.add("qwe");
        l.add("asd");
        l.add("zxc");
 
        //Итератор
        Iterator it = l.iterator();
        for(Iterator <String> iter = it; iter.hasNext();)
        {
            String str = iter.next();
            System.out.println(str);
        }
    }
}

TreeSet

TreeSet, в отличии от HashSet, хранит элементы упорядоченно, то есть в какм бы порядке мы не добавляли и не удаляли элементы, коллекция останется строго упорядоченной.

import java.util.TreeSet;
import java.util.Iterator;
public class Main 
{
    public static void main(String[] args)
    {
        TreeSet <String> l = new TreeSet();
        l.add("qwe");
        l.add("asd");
        l.add("zxc");
 
        //Итератор
        Iterator it = l.iterator();
        for(Iterator <String> iter = it; iter.hasNext();)
        {
            String str = iter.next();
            System.out.println(str);
        }
    }
}

LinkedHashSet

LinkedHashSet используется в том случае, если нам необходимо помнить порядок добавления элементом. Поиск по этой коллекции происходит также по hashCode, но порядок будет всегда совпадать с очерёдностью добавления.

import java.util.LinkedHashSet;
import java.util.Iterator;
public class Main 
{
    public static void main(String[] args)
    {
        LinkedHashSet <String> l = new LinkedHashSet();
        l.add("qwe");
        l.add("asd");
        l.add("zxc");
 
        //Итератор
        Iterator it = l.iterator();
        for(Iterator <String> iter = it; iter.hasNext();)
        {
            String str = iter.next();
            System.out.println(str);
        }
    }
}

Реализации Map

Map - отображение или ассоциативный массив. В Map добавляют не отдельные объекты, а пары объектов ( «ключ-значение» ). Соответственно есть операции поиска значения по ключу. Добавление пары с уже существующим в Map ключем приводит к замене, а не к добавлению.

HashMap

этот класс расширяет AbstractMap и весьма похож на класс Hashtable. HashMap предназначен для хранения пар объектов ключ/значение. Как для ключей, так и для элементов допускаются значения типа null. Порядок хранения элементов в этой коллекции не совпадает с порядком их добавления. Порядок элементов в коллекции также может меняться во времени. HashMap обеспечивает постоянное время доступа для операций get и put. Итерация по всем элементам коллекции пропорциональна еe eмкости. Поэтому имеет смысл не делать размер коллекций чрезмерно большим, если достаточно часто придјтся осуществлять итерацию по элементам.

import java.util.HashMap;
public class Main 
{
    public static void main(String[] args)
    {
        HashMap hm = new HashMap();
        hm.put("key1","Hello");
 
        System.out.println(hm.get("key1"));
    }
}

TreeMap

TreeMap содержит ключи в порядке возрастания. Используется либо натуральное сравнение ключей, либо должен быть реализован интерфейс Comparable. Реализация алгоритма поиска обеспечивает логарифмическую зависимость времени выполнения основных операций (containsKey, get, put и remove). Запрещено применение null значений для ключей. При использовании дубликатов ключей ссылка на объект, сохранeнный с таким же ключом, будет утеряна.

import java.util.TreeMap;
public class Main 
{
    public static void main(String[] args)
    {
        TreeMap tm = new TreeMap();
        tm.put("key1","Hello");
 
        System.out.println(tm.get("key1"));
    }
}

Hashtable