
Лекции, Кокарева, TR_TKC / 4. Контейнерные классы. Коллекции и карты
.docx
Контейнерные
классы
Лекция
4
по дисциплине: Технология разработки
ТК сервисов
СибГУТИ
Автор:
Е.В. Кокорева
1. Коллекции
Коллекции или контейнеры — это классы позволяющие хранить и производить операции над множеством объектов.
Стандартный набор коллекций Java служит для избавления программиста от необходимости самостоятельно реализовывать эти типы данных и снабжает его дополнительными возможностями.
Интерфейсы в Collections Framework играют ключевую роль. Все классы коллекций реализуют различные интерфейсы, которые определяют поведение коллекции.
Интерфейс определяет «что делает коллекция», а конкретная реализация — «как коллекция делает то, что определяет интерфейс».
При разработке приложений рекомендуется там, где возможно, использовать интерфейсы. Такая организация позволяет легко заменять реализацию интерфейса, с целью повышения производительности, а также позволяет разработчику сконцентрироваться на задаче, а не на особенностях реализации.
Взаимодействие интерфейсов коллекций и карт:
Инструментальный набор:
Интерфейс |
Классы |
Collection |
- |
Set |
HashSet LinkedHashSet |
SortedSet |
TreeSet |
Queue |
PriorityQueue |
Deque |
ArrayDeque |
List |
ArrayList Vector Stack LinkedList |
Map |
HashMap Hashtable LinkedHashMap |
SortedMap |
TreeMap |
2. Collection
Интерфейс Collection содержит набор общих методов, которые используются в большинстве коллекций:
-
boolean add(Object obj) – добавляет в коллекцию новый элемент, если элементы коллекции упорядочены, то новый элемент добавляется в конец коллекции, в коллекцию Set элемент добавляется только, если такого нет в коллекции;
-
boolean contains(Object obj) – возвращает true, если объект obj содержится в коллекции и false, если нет;
-
boolean isEmpty() – проверяет, пуста ли коллекция;
-
boolean remove(Object obj) – удаляет из коллекции элемент obj, возвращает false, если такого элемента в коллекции не нашлось;
-
int size() – возвращает количество элементов коллекции.
Пример:
import java.util.*;
public class Main {
public static void main(String[] args) {
Collection col = new HashSet();
String[] str = {"Hello", "Good Bye", "Window", "Hello"};
String[] st = {"Window", "Morning", "Food"};
for (int i = 0; i < str.length; i++){
if (col.add(str[i])) System.out.println("Добавляю элемент " + str[i]);
else System.out.println("Не могу добавить повторно " + str[i]);
}
System.out.print("Коллекция из " + col.size() + " элементов: ");
System.out.print(col);
System.out.println("\n");
for (int i = 0; i < st.length; i++){
if (col.remove(st[i])) System.out.println("Удаляю элемент " + st[i]);
else System.out.println("Не могу удалить " + st[i] + " нет такого элемента");
}
System.out.print("Коллекция из " + col.size() + " элементов: ");
System.out.print(col);
System.out.println("\n");
}
Результат работы:
Добавляю элемент Hello
Добавляю элемент Good Bye
Добавляю элемент Window
Не могу добавить повторно Hello
Коллекция из 3 элементов: [Window, Hello, Good Bye]
Удаляю элемент Window
Не могу удалить Morning - нет такого элемента
Не могу удалить Food - нет такого элемента
Коллекция из 2 элементов: [Hello, Good Bye]
Методы групповой обработки
Работают с коллекцией как с единым целым.
-
void clear() – удаляет все элементы коллекции;
-
boolean addAll(Collection c) – добавляет в коллекцию все элементы коллекции c;
-
boolean removeAll(Collection c) – удаляет из данной коллекции все элементы коллекции c;
-
boolean containsAll(Collection c) – возвращает true, если данная коллекция содержит коллекцию с;
-
boolean retainAll(Collection c) – удаляет из данной коллекции все элементы, не принадлежащие коллекции c.
Операции с массивами
-
Object[ ] toArray() – возвращает массив со всеми элементами коллекции;
-
Object[ ] toArray(Object a[]) – сохраняет элементы коллекции в массив определённого типа.
3. Iterator
Интерфейс Iterator служит для создания объекта для перебора элементов коллекции.
Создать объект итератор можно, вызвав метод iterator(), определённый в интерфейсе Collection, например:
Iterator iter = list.iterator();
где list – объект, содержащий список (коллекцию).
Интерфейс Iterator имеет три метода:
-
Object next() – возвращает очередной элемент коллекции, к которой «привязан» итератор (и делает его текущим). Порядок перебора определяет сам итератор.
-
boolean hasNext() – возвращает true, если существует следующий элемент коллекции;
-
void remove() – удаляет текущий элемент, не возвращая значения.
Пример применения итератора для последовательного перебора элементов коллекции:
Iterator iter = col.iterator();
while(iter.hasNext())
System.out.println("Следующий элемент: " + iter.next());
4. Интерфейс List
Классы-реализации:
-
Vector;
-
Stack;
-
ArrayList;
-
LinkedList (производный класс от интерфейсов List, Queue и Deque).
Пример работы с объектами класса ArrayList
public static void main(String[] args) {
Shape[] sh = {new Shape(), new Circle(2), new Triangle(1, 3, 3), new Square(5)};
ArrayList<Shape> arr = new ArrayList<Shape>();
for (int i = 0; i < sh.length; i++){
sh[i].area = sh[i].areaCalc();
sh[i].perimeter = sh[i].perimeterCalc();
arr.add(sh[i]);
}
if (!arr.isEmpty())
for (Shape shap : arr)
System.out.println ("Элемент коллекции №" + arr.indexOf(shap) + " " +
sh[arr.indexOf(shap)].getClass().getName() + " " + "Его площадь = " + sh[arr.indexOf(shap)].area);
System.out.println();
List ar = arr.subList(1,3);
ListIterator it = ar.listIterator();
while(it.hasNext()){
System.out.println("Элемент №" + it.nextIndex() + " " + ar.get(it.nextIndex()).getClass().getName());
it.next();
}
}
Результат работы
Элемент коллекции №0 Shape Его площадь = 0.0
Элемент коллекции №1 Circle Его площадь = 12.566
Элемент коллекции №2 Triangle Его площадь = 1.479019945774904
Элемент коллекции №3 Square Его площадь = 25.0
Элемент №0 Circle
Элемент №1 Triangle
5. Queue
Классы:
-
PriorityQueue;
-
Linked.
6. Deque
Классы:
-
ArrayDeque;
-
LinkedList.
7. Set
Классы:
-
HashSet;
-
LinkedHashSet.
8. SortedSet
Класс:
-
TreeSet.
9. Map
Карта – набор пар «Ключ-Значение» с возможностью выборки значения по ключу.
Методы
-
Object put(Object key, Object value) – вставляет в карту вхождение <ключ значение>;
-
Object get(Object key) – возвращает значение по ключу;
-
Object remove(Object key) – удаляет значение, соответствующее ключу;
-
boolean containsKey(Object key) – возвращает true, если данному ключу сопоставлено значение;
-
boolean containsValue(Object key) – возвращает true, если существует один или несколько ключей, которым сопоставлено данное значение;
-
int size() – возвращает количество уникальных ключей карты (вхождений);
-
boolean isEmpty() – возвращает true, если карта пуста;
-
void putAll(Map m) – копирует все элементы из переданной карты в текущую;
-
void clear() – очистить карту.
-
Пример:
Map<String, String> map = new HashMap<String, String>();
map.put("1", "a");
map.put("1", "2");
for(Entry<String, String> entry : map.entrySet()){
System.out.println(entry.getKey() + " " + entry.getValue());
}
Результат работы:
1 2
Спасибо
за внимание!