Похожие презентации:
Java Collections
1.
JAVACOLLECTIONS
Author: Olga Smolyakova
Oracle Certified Java 6 Programmer
[email protected]
1
2.
Содержание1.
2.
3.
4.
5.
6.
7.
8.
9.
Определение коллекций
Интерфейс Collection
Множества Set
Интерфейс Iterator
Списки List
Интерфейс ListIterator
Очереди Queue
Карты отображений Map
Класс Collections
2
3.
ОПРЕДЕЛЕНИЕ КОЛЛЕКЦИЙ3
4.
Определение коллекцийКоллекции – это хранилища, поддерживающие различные способы
накопления и упорядочения объектов с целью обеспечения
возможностей эффективного доступа к ним.
Коллекции в языке Java объединены в библиотеке классов java.util и
представляют собой контейнеры, т.е объекты, которые группируют
несколько элементов в отдельный модуль.
Коллекции используются для хранения, поиска,
передачи данных.
Collections framework - это унифицированная
представления и манипулирования коллекциями.
манипулирования и
архитектура
для
4
5.
Определение коллекцийспециализирует коллекции
для обработки списков
вершина иерархии
коллекций
специализирует коллекции для обработки множеств, содержащих уникальные элементов
5
6.
Определение коллекцийкарта отображения
вида “ключ-значение”
Все конкретные классы Java Collections Framework реализуют
Cloneable и Serializable интерфейсы.
6
7.
ИНТЕРФЕЙС COLLECTION7
8.
Интерфейс CollectionJDK не предоставляет прямых реализаций интерфейса Collection, но
существует
множество
реализаций
более
специфичных
подинтерфейсов таких как Set и List.
Некоторые методы интерфейса Collection могут быть не реализованы в
подклассах (нет необходимости их реализовывать). В этом случае
метод генерирует java.lang.UnsupportedOperationException.
8
9.
Интерфейс Collectionpublic interface Collection<E> extends Iterable<E> {
▪
boolean equals(Object o);
▪
int size();
interface Iterable<T>{
▪
boolean isEmpty();
▪ Iterator<T> iterator();
▪
boolean contains(Object element);
}
▪
boolean add(E element);
▪
boolean remove(Object element);
▪
Iterator<E> iterator();
▪
boolean containsAll(Collection<?> c);
▪
boolean addAll(Collection<? extends E> c);
▪
boolean removeAll(Collection<?> c);
Класс
▪
boolean retainAll(Collection<?> c);
AbstractCollection
▪
void clear();
предоставляет частичную
реализацию интерфейса
▪
Object[ ] toArray();
Collection, реализует все
▪
<T> T[ ] toArray(T[ ] a);
методы, за исключением
}
size() и iterator().
9
10.
МНОЖЕСТВА SET10
11.
Множества SetИнтерфейс Set, наследуясь
от интерфейса Collection,
не добавляет никаких новых
методов
Множество ─
коллекция без
повторяющихся
элементов
public interface Set<E>
extends Collection<E> {
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
▪
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element);
boolean remove(Object element);
Iterator<E> iterator();
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c);
boolean removeAll(Collection<?> c);
boolean retainAll(Collection<?> c);
void clear();
Object[] toArray();
<T> T[] toArray(T[] a);
}
11
12.
Множества SetКласс AbstractSet
public abstract class
AbstractSet<E>
extends AbstractCollection<E>
implements Set<E>
Конкретные реализации множеств
HashSet
LinkedHashSet
TreeSet
ConcurrentSkipListSet
CopyOnWriteArraySet
EnumSet
12
13.
Множества SetHashSet – неотсортированная и неупорядоченная коллекция не
содержащая повторяющихся элементов.
Для вставки элемента используются методы hashCode() и equals(…)
Set<MyDate> set = new
HashSet<MyDate>();
MyDate date1 = new MyDate(1);
MyDate date2 = new MyDate(1);
set.add(date1);
set.add(date2);
println(set.size());
class MyDate{
int day;
MyDate(int day){this.day = day; }
public boolean equals(Object obj){…}
public int hashCode(){… }
}
Set<MyDate> set = new
HashSet<MyDate>();
MyDate date1 = new MyDate(1);
MyDate date2 = new MyDate(2);
set.add(date1);
set.add(date2);
println(set.size());
1
MyDate date3 = new MyDate(1);
println(set.contains(date3)); 2
true
Чем эффективней реализован метод
hashCode(), тем эффективней работает
коллекция.
13
14.
Множества SetHashSet используется в случае, когда порядок элементов не важен, но
важно чтобы в коллекции все элементы были уникальны.
Set<String> set = new HashSet<String>();
set.add("London");
set.add("Paris");
set.add("New York");
set.add("San Francisco");
set.add("Berling");
set.add("New York");
System.out.println(set);
[San Francisco, New York, Paris, Berling, London]
for (Object element : set){
System.out.print(element.toString());
}
San Francisco New York Paris Berling London
14
15.
Множества SetКонструкторы HashSet
Создает новое пустое множество, capacity = 16, loadfactor = 0.75
HashSet()
HashSet(Collection<? extends E> c)
HashSet(int initialCapacity)
Создает новое множество,
содержащее элементы переданной
в качестве параметра коллекции
Создает новое пустое множество с
определенной начальной
емкостью
HashSet(int initialCapacity, float loadFactor)
Создает новое пустое множество с
определенной начальной емкостью и
определенным значением фактора
загрузки
15
16.
Множества SetРеализация класса HashSet
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
static final long serialVersionUID = -5024744406713321676L;
private transient HashMap<E, Object> map;
private static final Object PRESENT = new Object();
public HashSet() {
map = new HashMap<>();
}
…
}
16
17.
Множества SetLinkedHashSet<E> ─ множество c сохранением порядка обхода.
Set<String> set = new LinkedHashSet<String>();
set.add("London");
set.add("Paris");
set.add("New York");
set.add("San Francisco");
set.add("Berling");
set.add("New York");
System.out.println(set);
[London, Paris, New York, San Francisco, Berling]
for (Object element : set){
System.out.print(element.toString() + " ");
}
London Paris New York San Francisco Berling
17
18.
Множества SetРеализация класса LinkedHashSet
public class HashSet<E> extends AbstractSet<E>
implements Set<E>, Cloneable, java.io.Serializable {
...
HashSet(int initialCapacity, float loadFactor, boolean dummy) {
map = new LinkedHashMap<>(initialCapacity, loadFactor);
}
...
public class LinkedHashSet<E> extends HashSet<E>
}
implements Set<E>, Cloneable, java.io.Serializable {
public LinkedHashSet(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor, true);}
public LinkedHashSet(int initialCapacity) {
super(initialCapacity, .75f, true);}
public LinkedHashSet() {
super(16, .75f, true);}
public LinkedHashSet(Collection<? extends E> c) {
super(Math.max(2 * c.size(), 11), .75f, true);
addAll(c);}
}
18
19.
Множества SetSortedSet<E> ─ множество c предоставлением возможности
полного упорядочивания элементов. Элементы упорядочиваются
или согласно естественному порядку сортировки или согласно
порядку, который задает Comparator.
public interface SortedSet<E> extends Set<E>{
▪ Comparator<? super E> comparator();
▪ E first();
▪ SortedSet<E> headSet(E toElement);
▪ E last();
▪ SortedSet<E> subSet(E fromElement, E toElement);
▪ SortedSet<E> tailSet(E fromElement);
}
19
20.
Множества SetNavigableSet<E> ─ расширяет SortedSet, добавляет методы
навигации, определяющие ближайший экземпляр по отношению к
экземпляру, заданному для поиска.
public interface NavigableSet<E> extends SortedSet<E>
E lower(E e); < E
E floor(E e);
E pollFirst();
<= E
E higher(E e); > E
E pollLast();
E ceiling(E e); >= E
Iterator<E> iterator();
Iterator<E> descendingIterator();
NavigableSet<E> descendingSet();
20
21.
Множества Setpublic interface NavigableSet<E> extends SortedSet<E>
NavigableSet<E> headSet(E toElement, boolean inclusive)
NavigableSet<E> subSet( E fromElement, boolean fromInclusive,
E toElement, boolean toInclusive)
NavigableSet<E> tailSet(E fromElement, boolean inclusive)
SortedSet<E> headSet(E toElement)
SortedSet<E> subSet(E fromElement, E toElement)
SortedSet<E> tailSet(E fromElement)
21
22.
Множества SetTreeSet<E> – сортированное множество, хранящее элементы в
виде бинарного дерева.
Конструкторы и реализация TreeSet
public class TreeSet<E> extends AbstractSet<E>
implements NavigableSet<E>, Cloneable, java.io.Serializable {
1 private transient NavigableMap<E, Object> m;
private static final Object PRESENT = new Object();
2 public TreeSet() {
3
this(new TreeMap<E, Object>());
}
public TreeSet(Comparator<? super E> comparator) {
this(new TreeMap<>(comparator)); }
4 public TreeSet(Collection<? extends E> c) {
this();
addAll(c);
}
5 public TreeSet(SortedSet<E> s) {
this(s.comparator());
addAll(s);
}
}
22
23.
Множества SetTreeSet<String> treeSet1 = new TreeSet<String>(new LastLetterComparator());
treeSet1.add("London"); treeSet1.add("Paris");
treeSet1.add("New York"); treeSet1.add("San Francisco");
treeSet1.add("Berling"); treeSet1.add("New York");
System.out.println(treeSet1);
[Berling, New York, London, San Francisco, Paris]
TreeSet<String> treeSet2 = new TreeSet<String>();
treeSet2.add("London"); treeSet2.add("Paris");
treeSet2.add("New York"); treeSet2.add("San Francisco");
treeSet2.add("Berling"); treeSet2.add("New York");
System.out.println(treeSet2);
[Berling, London, New York, Paris, San Francisco]
23
24.
ИНТЕРФЕЙС ITERATOR24
25.
Интерфейс IteratorДля обхода коллекции можно
использовать:
for-each
Конструкция for-each является краткой формой записи обхода
коллекции с использованием цикла for
for (Object o: collection){
System.out.println(o);
}
Iterator
Итератор - это объект, который позволяет осуществлять обход
коллекции и при желании удалять избранные элементы.
interface Iterable<T>{
Iterator<T> iterator();
}
25
26.
Интерфейс IteratorМетод Iterator<E> iterator() коллекций – возвращает итератор.
Set<String> set = new HashSet<String>();
set.add("London");
set.add("Paris");
set.add("New York");
set.add("San Francisco");
set.add("Berling");
set.add("New York");
Iterator<String> iterator = set.iterator();
26
27.
Интерфейс Iteratorpublic interface Iterator
{
boolean hasNext();
Object next();
void remove();
}
Set<String> set = new TreeSet<String>();
set.add("London"); set.add("Paris");
set.add("New York"); set.add("San Francisco");
set.add("Berling"); set.add("New York");
Iterator<String> iterator = set.iterator();
true
if( iterator.hasNext() ){}
27
28.
Интерфейс IteratorString str = null;
if(iterator.hasNext()){
str = iterator.next();
}
iterator.remove();
Исключения:
NoSuchElementException ─ генерируется при достижении конца коллекции
ConcurrentModificationException ─ генерируется при изменении коллекции
28
29.
Интерфейс IteratorПеребор элементов коллекции через итератор:
1
Iterator<String> iterator = set.iterator();
2 while (iterator.hasNext()) {
3
System.out.print(iterator.next() + " ");
}
возвращает объект, на который указывает
итератор, и передвигает текущий указатель на
следующий итератор
Если следующий элемент
коллекции отсутствует, то метод
next() генерирует исключение
static void filter(Collection<?> c) {
for (Iterator<?> it = c.iterator(); it.hasNext();)
if (!cond(it.next()))
it.remove();
}
удаляет объект, возвращенный последним
вызовом метода next()
29
30.
СПИСКИ LIST30
31.
Списки ListСписок - упорядоченная коллекция
Интерфейс List сохраняет последовательность добавления элементов
и позволяет осуществлять доступ к
элементу по индексу.
31
32.
Списки Listpublic interface List<E> extends Collection<E> {
E get(int index);
E set(int index, E element);
boolean add(E element);
void add(int index, E element);
E remove(int index);
boolean addAll(int index, Collection<? extends E> c);
int indexOf(Object o);
List<String> list =
int lastIndexOf(Object o);
new ArrayList<String>();
ListIterator<E> listIterator();
ListIterator<E> listIterator(int index); list.add("London");
list.add("Paris");
List<E> subList(int from, int to);
list.add("New York");
}
list.add("San Francisco");
list.add("Berling");
list.add("New York");
32
33.
Списки ListРеализации и конкретные реализации списков
AbstractList,
AbstractSequentialList,
ArrayList,
LinkedList,
CopyOnWriteArrayList,
Stack,
Vector
Класс
AbstractList
предоставляет
частичную
реализацию
для
интерфейса List. Реализует все
методы, кроме метода get().
Класс AbstractSequentialList расширяет
AbstractList,
чтобы
предоставить
поддержку для связных списков.
33
34.
Списки ListArrayList<E> ─ список на базе массива (реализация List)
Конструкторы и реализация ArrayList
public class ArrayList<E> extends AbstractList<E>
implements List<E>,RandomAccess, Cloneable, java.io.Serializable {
private static final int DEFAULT_CAPACITY = 10;
private static final Object[] EMPTY_ELEMENTDATA = {};
private transient Object[] elementData;
private int size;
public ArrayList(int initialCapacity) {
super();
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "
+ initialCapacity);
this.elementData = new Object[initialCapacity];
}
}
34
35.
Списки ListКонструкторы и реализация ArrayList
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
}
Дополнительные методы
▪ void ensureCapacity(int minCapacity) ─ определение
вместимости
▪ void trimToSize() ─ “подгонка” вместимости
35
36.
Списки ListLinkedList<E> ─ двусвязный список
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable {
transient int size = 0;
transient Node<E> first;
transient Node<E> last;
public LinkedList() {}
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
}
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element,
Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
36
37.
Списки ListДополнительные методы
void addFirst(E o)
void addLast(E o)
E removeFirst()
E removeLast()
E getFirst()
E getLast()
LinkedList<Integer> list = new LinkedList<Integer>();
list.add(1);
list.addFirst(2);
list.addLast(6);
list.add(7);
list.addFirst(9);
list.removeLast();
for (Iterator<Integer> it = list.iterator();
it.hasNext();){
System.out.print(it.next() + " ");
}
9 2 1 6
37
38.
Списки ListVector – потокобезопасная версия ArrayList в Java 1.0/1.1
Реализация класса Vector
public class Vector<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable {
protected Object[] elementData;
protected int elementCount;
protected int capacityIncrement;
public Vector(int initialCapacity, int capacityIncrement) {…}
public Vector(int initialCapacity) {…}
public Vector() {…}
public Vector(Collection<? extends E> c) {…}
public synchronized void copyInto(Object[] anArray) {…}
public synchronized void trimToSize() {…}
…
}
38
39.
Списки ListVector<Integer> v = new Vector<Integer>(3, 2);
v.addElement(new Integer(1));
v.addElement(new Integer(2));
v.addElement(new Integer(3));
v.addElement(new Integer(4));
Enumeration vEnum = v.elements();
while (vEnum.hasMoreElements()) {
System.out.print(vEnum.nextElement() + " ");
}
1 2 3 4
public interface Enumeration<E> {
boolean hasMoreElements();
E nextElement();
предоставление однопроходного
}
последовательного доступа к серии
объектов
39
40.
Списки ListКласс Stack - позволяет создавать очередь типа last-in-first-out
(LIFO)
public class Stack<E> extends Vector<E> {
public Stack() {}
public E push(E item) {…}
public synchronized E pop() {…}
public synchronized E peek() {…}
public boolean empty() {…}
public synchronized int search(Object o) {…}
}
char[] ar = "a - (b - (c - a) / (b + c) - 2)".toCharArray();
Stack<Character> stack = new Stack<Character>();
for (int i = 0; i < ar.length; i++) {
String symbol = new Character(ar[i]).toString();
if ("(".equals(symbol)) { stack.push(ar[i]); continue;
if (")".equals(symbol)) {
stack.pop();
continue; }
}
}
if (stack.isEmpty()){ System.out.println("баланс скобок соблюден");}
40
41.
ИНТЕРФЕЙС LISTITERATOR41
42.
Интерфейс ListIteratorListIterator<E> - итератор для списка, позволяющий проходить список
в любом направлении
interface ListIterator<E> extends Iterator {
boolean hasNext();
boolean hasPrevious();
E next();
E previous();
int nextIndex();
int previousIndex();
void remove();
void set(E o);
void add(E o);
}
42
43.
Интерфейс ListIteratorList<String> list = new LinkedList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
list.add("5");
for (ListIterator<String> li = list.listIterator(); li.hasNext(); ){
String str = li.next();
if(str.equals("3")){
li.add("33");
li.remove();
}
}
43
44.
ОЧЕРЕДИ QUEUE44
45.
Очереди QueueFIFO
Очередь
–
хранилище
элементов (FIFO, LIFO),
предназначенных
для
обработки.
LIFO/FIFO
Очереди не могут хранить null.
У очереди может быть ограничен размер.
45
46.
Очереди Queueвозвращают
специальное
значение
выбрасывают
исключение
public interface Queue<E> extends Collection<E> {
}
boolean add(E e);
добавляет в конец очереди новый элемент и
возвращает true, если вставка удалась
E remove(); возвращает и удаляет головной элемент очереди
E element(); возвращает, но не удаляет головной элемент очереди
boolean offer(E e);
E poll();
E peek();
добавляет в конец очереди новый элемент и
возвращает true, если вставка удалась
возвращает и удаляет головной элемент очереди
возвращает, но не удаляет головной элемент очереди
Класс AbstractQueue –
частичная реализация
интерфейса Queue.
46
47.
Очереди QueuePriorityQueue
приоритетами.
–
очередь
с
public class PriorityQueue<E> extends AbstractQueue<E> implements
java.io.Serializable {
private static final int DEFAULT_INITIAL_CAPACITY = 11;
private transient Object[] queue;
public PriorityQueue() {this(DEFAULT_INITIAL_CAPACITY, null);}
public PriorityQueue(int initialCapacity) {this(initialCapacity, null);}
public PriorityQueue(int initialCapacity, Comparator<? super E> comparator){}
public PriorityQueue(Collection<? extends E> c) {
}
public PriorityQueue(PriorityQueue<? extends E> c) { }
public PriorityQueue(SortedSet<? extends E> c) {
}
}
Очередь с приоритетами размещает элементы согласно естественному
порядку сортировки используя Comparable (по умолчанию).
Также можно указать специальный порядок размещения, используя
Comparator
47
48.
Очереди QueuePriorityQueue
PriorityQueue<String> queue2
= new PriorityQueue<String>(4, Collections.reverseOrder());
queue2.offer("Oklahoma");
queue2.offer("Indiana");
queue2.offer("Georgia");
queue2.offer("Texas");
while (queue2.size() > 0) {
System.out.print(queue2.remove() + " ");
}
Texas Oklahoma Indiana Georgia
48
49.
Очереди QueueConcurrentLinkedQueue – потокобезопасная, неблокирующая
реализация Queue на связанных узлах (linked nodes)
public class ConcurrentLinkedQueue<E>
extends AbstractQueue<E>
implements Queue<E>, java.io.Serializable {
private transient volatile Node<E> head;
private transient volatile Node<E> tail;
public ConcurrentLinkedQueue() {}
public ConcurrentLinkedQueue(Collection<? extends E> c) {}
}
49
50.
Очереди Queueвыбрасывают
исключение
void addFirst(E e); void push(E e);
E removeFirst(); E remove(); E pop();
E getFirst(); E element();
возвращают
специальное
значение
boolean offerFirst(E e);
E pollFirst(); E poll();
E peekFirst(); E peek();
выбрасывают
исключение
void addLast(E e);
E removeLast();
E getLast();
возвращают
специальное
значение
boolean offerLast(E e); boolean offer(E e);
E pollLast();
E peekLast();
boolean add(E e);
TAIL
HEAD
public interface Deque<E> extends Queue <E> {
50
51.
Очереди Queue.Deque<E>
boolean remove(Object o);
boolean removeFirstOccurrence(Object o);
boolean removeLastOccurrence(Object o);
boolean contains(Object o);
public int size();
Iterator <E> iterator();
Iterator <E> descendingIterator();
}
51
52.
Очереди QueueLinkedList<E> ─ реализация FIFO/LIFO очереди
Deque<String> deque= new LinkedList<String>();
deque.offer("Oklahoma");
deque.offer("Indiana");
deque.offer("Georgia");
deque.offer("Texas");
while (queue.size() > 0){
System.out.print(queue.remove() + " ");
}
Oklahoma Indiana Georgia Texas
52
53.
Очереди QueueArrayDeque - реализация интерфейса Deque с использованием
массива.
public class ArrayDeque<E>
extends AbstractCollection<E>
implements Deque<E>, Cloneable, Serializable {
private transient E[] elements;
private transient int head;
private transient int tail;
public ArrayDeque() {
elements = (E[]) new Object[16];
}
public ArrayDeque(int numElements) {}
}
53
54.
Очереди QueueArrayDeque
Deque<String> stack = new ArrayDeque<String>();
stack.push("A");
stack.push("B");
stack.push("C");
stack.push("D");
while (!stack.isEmpty()){
System.out.print(stack.pop() + " ");
D C B A
}
Deque<String> queue = new ArrayDeque<String>();
queue.add("A");
queue.add("B");
queue.add("C");
queue.add("D");
while (!queue.isEmpty()){
System.out.print(queue.remove() + " ");
A B C D
}
54
55.
Очереди QueueConcurrentLinkedDeque – потокобезопасная, неблокирующая
реализация Deque на связанных узлах (linked nodes)
public class ConcurrentLinkedDeque<E>
extends AbstractCollection<E>
implements Deque<E>, java.io.Serializable {
private transient volatile Node<E> head;
private transient volatile Node<E> tail;
public ConcurrentLinkedDeque() {}
public ConcurrentLinkedDeque(Collection<? extends E> c) {}
}
55
56.
КАРТЫ ОТОБРАЖЕНИЙ MAP56
57.
Карты отображений MapИнтерфейс Map работает с
наборами пар объектов
«ключ-значение»
Все ключи в картах уникальны.
Уникальность ключей
определяет реализация
метода equals(…).
Для корректной работы с картами необходимо переопределить
методы equals(…) и hashCode(), допускается добавление
объектов без переопределения этих методов, но найти эти
объекты в Map вы не сможете.
57
58.
Карты отображений Mappublic interface Map<K,V> {
V put(K key, V value);
V get(Object key);
V remove(Object key);
boolean containsKey(Object key);
boolean containsValue(Object value);
int size();
boolean isEmpty();
void putAll(Map<? extends K, ? extends V> m);
void clear();
public Set<K> keySet();
public Collection<V> values();
public Set<Map.Entry<K,V>> entrySet();
}
58
59.
Карты отображений Mappublic static interface Map.Entry<K,V> {
boolean equals(Object o);
K getKey();
V getValue();
int hashCode();
V setValue(V value);
}
59
60.
Карты отображений MapКласс AbstractMap - предоставляет частичную реализацию интерфейса Map.
public abstract class AbstractMap<K,V> implements Map<K,V>
Конкретные реализации карт отображений
HashMap
LinkedHashMap
TreeMap
IdentityHashMap
WeakHashMap
Hashtable
ConcurrentHashMap
ConcurrentSkipListMap
Properties
EnumMap
60
61.
Карты отображений MapHashMap – неотсортированная и неупорядоченная карта,
эффективность работы HashMap зависит от того, насколько
эффективно реализован метод hashCode().
Реализация и конструкторы класса HashMap
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable{
static final Entry<?,?>[] EMPTY_TABLE = {};
transient Entry<K,V>[] table = (Entry<K,V>[]) EMPTY_TABLE;
public HashMap(int initialCapacity, float loadFactor) {...}
public HashMap(int initialCapacity) {...}
public HashMap() {...}
public HashMap(Map<? extends K, ? extends V> m) {...}
...
}
61
62.
Карты отображений Mapstatic class Entry<K, V>
implements Map.Entry<K, V> {
final K key;
V value;
Entry<K, V> next;
int hash;
...
}
HashMap может принимать в качестве ключа null, но такой ключ
может быть только один, значений null может быть сколько
угодно.
62
63.
Карты отображений MapHashMap
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(new Integer(1), "one");
map.put(new Integer(2), "two");
map.put(new Integer(3), "three");
Set<Integer> keySet = map.keySet();
for (Iterator<Integer> it = keySet.iterator(); it.hasNext();){
Integer key = it.next();
System.out.println(key + " - " + map.get(key));
}
1 - one
2 - two
3 - three
63
64.
Карты отображений MapHashMap
Map.Entry
Map<Integer, String> map = new HashMap<Integer, String>();
map.put(new Integer(1), "one");
map.put(new Integer(2), "two");
map.put(new Integer(3), "three");
Iterator<Map.Entry<Integer, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry<Integer, String> entry = iter.next();
println(entry.getKey() + " -- " + entry.getValue());
}
1 -- one
2 -- two
3 -- three
64
65.
Карты отображений MapLinkedHashMap – порядок, в котором хранятся элементы в
LinkedHashMap, определяется порядком установки их в
LinkedHashMap (insertion-order).
LinkedHashMap<Integer, String> map1 =
new LinkedHashMap<Integer, String>();
map1.put(new Integer(4), "four");
map1.put(new Integer(1), "one");
map1.put(new Integer(3), "three");
map1.put(new Integer(2), "two");
System.out.println(map1);
{4=four, 1=one, 3=three, 2=two}
65
66.
Карты отображений Mappublic interface SortedMap<K,V> extends Map<K,V>{
Comparator<? super K> comparator();
Set<Map.Entry<K,V>> entrySet();
K firstKey();
SortedMap<K,V> headMap(K toKey);
Set<K> keySet();
K lastKey();
SortedMap<K,V> subMap(K fromKey, K toKey);
SortedMap<K,V> tailMap(K fromKey);
Collection<V> values();
}
66
67.
Карты отображений Mappublic interface NavigableMap<K,V> extends SortedMap<K,V> {
Map.Entry<K,V> lowerEntry(K key); <
Map.Entry<K,V> floorEntry(K key); <=
Map.Entry<K,V> higherEntry(K key); >
Map.Entry<K,V> ceilingEntry(K key); >=
K lowerKey(K key);
K floorKey(K key);
K higherKey(K key);
K ceilingKey(K key);
Map.Entry<K,V> pollFirstEntry();
Map.Entry<K,V> pollLastEntry();
Map.Entry<K,V> firstEntry();
Map.Entry<K,V> lastEntry();
67
68.
Карты отображений MapNavigableMap<K,V> descendingMap();
NavigableSet navigableKeySet();
NavigableSet descendingKeySet();
NavigableMap<K,V> subMap(K fromKey, boolean fromInclusive,
K toKey, boolean toInclusive);
NavigableMap<K,V> headMap(K toKey, boolean inclusive);
NavigableMap<K,V> tailMap(K fromKey, boolean inclusive);
SortedMap<K,V>
subMap(K fromKey, K toKey);
SortedMap<K,V>
headMap(K toKey);
SortedMap<K,V>
tailMap(K fromKey);
}
68
69.
Карты отображений MapTreeMap –хранит элементы в порядке сортировки.
Реализация TreeMap
public class TreeMap<K,V> extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, java.io.Serializable
{
private final Comparator<? super K> comparator;
private transient Entry<K,V> root = null;
private transient int size = 0;
private transient int modCount = 0;
public TreeMap() {…}
public TreeMap(Comparator<? super K> comparator) {…}
public TreeMap(Map<? extends K, ? extends V> m) {…}
public TreeMap(SortedMap<K, ? extends V> m) {…}
}
69
70.
Карты отображений MapTreeMa
p
Map<String, Integer> treeMap = new TreeMap<String, Integer>();
treeMap.put("Smith", 30);
treeMap.put("Anderson", 31);
treeMap.put("Lewis", 29);
treeMap.put("Cook", 29);
System.out.println(treeMap);
{Anderson=31, Cook=29, Lewis=29, Smith=30}
70
71.
Карты отображений MapHashtable – унаследованная потокобезопасная коллекция, аналог
HashMap. Порядок следования пар ключ/значение не
определен.
Реализация Hashtable
public class Hashtable<K, V> extends Dictionary<K, V>
implements Map<K, V>,Cloneable, java.io.Serializable {
private transient Entry<K, V>[] table;
private transient int count;
public Hashtable(int initialCapacity, float loadFactor) { }
public Hashtable(int initialCapacity) {}
public Hashtable() {
}
public Hashtable(Map<? extends K, ? extends V> t) { }
public synchronized int size() {
}
public synchronized boolean isEmpty() {}
public synchronized Enumeration<K> keys() { }
}
71
72.
Карты отображений MapHashtable<String, String> ht = new Hashtable<String, String>();
ht.put("1", "One");
ht.put("2", "Two");
ht.put("3", "Three");
Collection c = ht.values();
Iterator itr = c.iterator();
while (itr.hasNext()) {
System.out.println(itr.next());
}
Three
Two
One
c.remove("One");
Enumeration e = ht.elements();
while (e.hasMoreElements()) {
Three
System.out.println(e.nextElement()); Two
}
72
73.
Карты отображений MapConcurrentHashMap – потокобеопасная версия HashMap. В отличие от
Hashtable и блоков synhronized на HashMap, данные представлены в
виде сегментов, разбитых по hash'ам ключей. В результате, дданные
лочатся по сегментам, а не по одному объекту.
ConcurrentSkipListMap – потокобезопасная версия TreeMap.
73
74.
Карты отображений MapКласс Properties
(параметров).
предназначен
для
хранения
набора
свойств
public class Properties extends Hashtable<Object, Object> {…
public Properties() {}
public Properties(Properties defaults) {}
public synchronized Object setProperty(String key, String value) {}
public synchronized void load(Reader reader) {}
public synchronized void load(InputStream inStream) {}
public void store(Writer writer, String comments) {}
public void store(OutputStream out, String comments) {}
public synchronized void loadFromXML(InputStream in) {}
public void storeToXML(OutputStream os, String comment) {}
public void storeToXML(OutputStream os, String comment, String encoding){}
public String getProperty(String key) {}
public String getProperty(String key, String defaultValue) {}
public Enumeration<?> propertyNames() {}
public Set<String> stringPropertyNames() {}
public void list(PrintStream out) {}
public void list(PrintWriter out) {}
}
74
75.
Карты отображений MapProperties
Properties capitals = new Properties();
Set states;
String str;
capitals.put("Illinois", "Springfield");capitals.put("Missouri", "Jefferson City");
capitals.put("Washington", "Olympia");capitals.put("California", "Sacramento");
capitals.put("Indiana", "Indianapolis");
states = capitals.keySet();
Iterator itr = states.iterator();
while (itr.hasNext()) {
str = (String) itr.next();
System.out.printlnstr + " is "
+ capitals.getProperty(str);
}
Missouri - Jefferson City
Illinois - Springfield
Indiana - Indianapolis
California - Sacramento
Washington - Olympia
str = capitals.getProperty("Florida", "Not Found");
System.out.println("The capital of Florida is "
+ str + ".");
The capital of Florida is Not Found.
75
76.
Карты отображений MapEnumMap – карта отображений, в качестве ключей используются
элементы перечисления. Null ключи запрещены. Null значения
допускаются.
Конструкторы EnumMap
public class EnumMap<K extends Enum<K>, V>
extends AbstractMap<K, V>
implements java.io.Serializable, Cloneable{
public EnumMap(Class<K> keyType) {
}
public EnumMap(EnumMap<K, ? extends V> m) {
}
public EnumMap(Map<K, ? extends V> m) {
}
}
76
77.
Карты отображений MapEnumMap
enum Size {
S, M, L, XL, XXL, XXXL;
}
...
EnumMap<Size, String> sizeMap
= new EnumMap<Size, String>(Size.class);
sizeMap.put(Size.S, "маленький");
sizeMap.put(Size.M, "средний");
sizeMap.put(Size.L, "большой");
sizeMap.put(Size.XL, "очень большой");
sizeMap.put(Size.XXL, "очень-очень большой");
sizeMap.put(Size.XXXL, "ну оооооочень большой");
for (Size size : Size.values()) {
System.out.println(size
+ ":" + sizeMap.get(size));
}
S:маленький
M:средний
L:большой
XL:очень большой
XXL:очень-очень большой
XXXL:ну оооооочень большой
77
78.
КЛАСС COLLECTIONS78
79.
Класс CollectionsCollections — класс, состоящий из статических методов,
осуществляющих различные служебные операции над
коллекциями.
79
80.
Класс Collectionssort
public static <T extends Comparable<? super T>> void sort(List<T> list)
public static <T> void sort(List<T> list, Comparator<? super T> c)
Сортировка списка, используя merge sort алгоритм, с гарантированной скоростью O (n*log n).
List<String> list1
= Arrays.asList("red", "greean", "blue");
Collections.sort(list1);
System.out.println(list1); [blue, greean, red]
List<String> list2
= Arrays.asList("greean", "red", "yellow", "blue");
Collections.sort(list2, Collections.reverseOrder());
System.out.println(list2);
[yellow, red, greean, blue]
80
81.
Класс CollectionsbinarySearch
public static <T>
int binarySearch(List<? extends Comparable<? super T>> list, T key)
public static <T>
int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
Бинарный поиск элементов в списке.
List<Integer> list3 = Arrays
.asList(2, 4, 7, 10, 11, 45, 50, 59, 60, 66);
println("(1) Index: “ + Collections.binarySearch(list3, 7));
(1) Index: 2
println("(2) Index: " + Collections.binarySearch(list3, 9));
(2) Index: -4
List<String> list4 = Arrays.asList("blue", "green", "red");
println("(3) Index: " + Collections.binarySearch(list4, "red"));
(3) Index: 2
println("(4) Index: " + Collections.binarySearch(list4, "cyan"));
(4) Index: -2
81
82.
Класс Collectionsreverse
public static void reverse(List<?> list)
Меняет порядок элементов в списке
List<String> list1
= Arrays.asList("yellow", "red", "green", "blue");
Collections.reverse(list1);
System.out.println(list1);
[blue, green, red, yellow]
82
83.
Класс Collectionsshuffle
public static void shuffle(List<?> list)
public static void shuffle(List<?> list, Random rnd)
List<String> list2
= Arrays.asList("yellow", "red", "green", "blue");
Collections.shuffle(list2);
System.out.println(list2);
[yellow, blue, green, red]
83
84.
Класс Collectionsswap
public static void swap(List<?> list, int i, int j)
List<String> list = new
ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
list.add("4");
System.out.println(list);
Collections.swap(list, 1, 3);
System.out.println(list);
[1, 2, 3, 4]
[1, 4, 3, 2]
84
85.
Класс Collectionsfill
public static <T> void fill(List<? super T> list, T obj)
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add(new String("A"));
list.add("D");
System.out.println(list);
Collections.fill(list, new String("V"));
[A, B, A, D]
[V, V, V, V]
true
System.out.println(list);
System.out.println(list.get(0) == list.get(1));
85
86.
Класс Collectionscopy
static <T> void copy(List<? super T> dest, List<? extends T> src)
List<String>
List<String>
srclst = new ArrayList<String> (5);
destlst = new ArrayList<String> (10);
srclst.add("a");
srclst.add("b");
destlst.add("d");
destlst.add("e");
destlst.add("f");
Collections.copy(destlst, srclst);
System.out.println(srclst);
System.out.println(destlst);
[a, b]
[a, b, f]
86
87.
Класс Collectionsmin, max
static <T extends Object & Comparable<? super T>> T min(Collection<? extends T> coll)
static <T> T min(Collection<? extends T> coll, Comparator<? super T> comp)
static <T extends Object & Comparable<? super T>> T max(Collection<? extends T> coll)
static <T> T max(Collection<? extends T> coll, Comparator<? super T> comp)
List<Integer> list = new
LinkedList<Integer>();
list.add(-8);
list.add(4);
list.add(-5);
list.add(1);
System.out.println(Collections.min(list));
System.out.println(Collections.max(list));
-8
4
87
88.
Класс Collectionsrotate
public static void rotate(List<?> list, int distance)
List<Integer> numbers = new ArrayList<Integer>();
for (int i = 0; i < 5; i++) {
numbers.add(i);
}
println(Arrays.toString(numbers.toArray()));
Collections.rotate(numbers, 3);
println(Arrays.toString(numbers.toArray())); [0, 1, 2, 3, 4]
[2, 3, 4, 0, 1]
88
89.
Класс CollectionsreplaceAll
public static <T> boolean replaceAll(List<T> list, T oldVal, T newVal)
List<String> list = new ArrayList<String>();
list.add("A");
list.add("B");
list.add("A");
list.add("C");
System.out.println(list);
Collections.replaceAll(list, "A", "AA");
System.out.println(list);
[A, B, A, C]
[AA, B, AA, C]
89
90.
Класс CollectionsindexOfSubList
lastIndexOfSubList
public static int indexOfSubList(List<?> source, List<?> target)
public static int lastIndexOfSubList(List<?> source, List<?> target)
List<String> arrlistsrc = new ArrayList<String>();
List<String> arrlisttarget = new ArrayList<String>();
arrlistsrc.add("A"); arrlistsrc.add("D");
arrlistsrc.add("C"); arrlistsrc.add("D");
arrlistsrc.add("E"); arrlistsrc.add("F");
arrlisttarget.add("C"); arrlisttarget.add("D");
arrlisttarget.add("E");
int index = Collections.indexOfSubList(arrlistsrc, arrlisttarget);
System.out.println(index);
2
90
91.
Класс CollectionsunmodifibleCollection
<T> Collection<T> unmodifiableCollection(Collection<? extends T> c)
<T> Set<T> unmodifiableSet(Set<? extends T> s)
<T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
<T> List<T> unmodifiableList(List<? extends T> list)
<K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m)
<K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m)
List<String> list1 = Arrays.asList("red", "greean", "blue");
List<String> list = Collections.unmodifiableList(list1);
list.add("black");
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
91
92.
Класс CollectionssynchronizedCollection
<T> Collection<T> synchronizedCollection(Collection<T> c)
<T> Set<T> synchronizedSet(Set<T> s)
<T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
<T> List<T> synchronizedList(List<T> list)
<K,V> Map<K,V> synchronizedMap(Map<K,V> m)
<K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
Set<String> set = new HashSet<String>();
set.add("A");
set.add("B");
set.add("С");
set.add("D");
Set<String> synset = Collections.synchronizedSet(set);
92
93.
Класс CollectionscheckedCollection
<E> Collection<E> checkedCollection(Collection<E> c, Class<E> type)
<E> Set<E> checkedSet(Set<E> s, Class<E> type)
<E> SortedSet<E> checkedSortedSet(SortedSet<E> s, Class<E> type)
<E> List<E> checkedList(List<E> list, Class<E> type)
<K, V> Map<K, V> checkedMap(Map<K, V> m, Class<K> keyType, Class<V> valueType)
<K,V> SortedMap<K,V> checkedSortedMap(SortedMap<K, V> m, Class<K> keyType, Class<V> valueType)
Set<String> hset = new TreeSet<String>();
hset.add("A"); hset.add("B"); hset.add("C");
Set<String> tsset = Collections.checkedSet(hset, String.class);
System.out.println(tsset);
93
94.
Класс CollectionsemptyIterator
emptyListIterator
emptyEnumerator
public static <T> Iterator<T> emptyIterator()
public static <T> ListIterator<T> emptyListIterator()
public static <T> Enumeration<T> emptyEnumeration()
ListIterator<String> it = Collections.emptyListIterator();
System.out.println(it.hasNext());
System.out.println(it.hasPrevious());
false
false
94
95.
Класс CollectionsemptySet
emptyList
emptyMap
public static final <T> Set<T> emptySet()
public static final <T> List<T> emptyList()
public static final <K,V> Map<K,V> emptyMap()
Set<String> set = Collections.EMPTY_SET;
set.add("A");
Exception in thread "main"
java.lang.UnsupportedOperationException
at java.util.AbstractCollection.add(Unknown Source)
95
96.
Класс Collectionssingleton
singletonList
singletonMap
public static <T> Set<T> singleton(T o)
public static <T> List<T> singletonList(T o)
public static <K,V> Map<K,V> singletonMap(K key, V value)
Set<String> set = Collections.singleton("A");
set.add("B");
Exception in thread "main"
java.lang.UnsupportedOperationException
at java.util.AbstractCollection.add(Unknown Source)
96
97.
Интерфейс IteratorУдаление всех экземпляров определенного элемента е из
коллекции с :
c.removeAll(Collections.singleton(e));
Удаление всех элементов null из коллекции
c.removeAll(Collections.singleton(null));
97
98.
Класс CollectionsnCopies
public static <T> List<T> nCopies(int n, T o)
List<String> list = Collections.nCopies(5, new String("A"));
println(list);
println(list.get(0) == list.get(1));
[A, A, A, A, A]
true
98
99.
Класс CollectionsreverseOrder
public static <T> Comparator<T> reverseOrder()
public static <T> Comparator<T> reverseOrder(Comparator<T> cmp)
List<Integer> list = new LinkedList<Integer>();
list.add(-8);
list.add(2);
list.add(-2);
list.add(8);
Comparator<Integer> cmp = Collections.reverseOrder();
Collections.sort(list, cmp);
System.out.println(list);
[8, 2, -2, -8]
99
100.
Класс Collectionsenumeration
list
public static <T> Enumeration<T> enumeration(final Collection<T> c)
public static <T> ArrayList<T> list(Enumeration<T> e)
List<String> list = new ArrayList<String>();
Vector<String> v = new Vector<String>();
v.add("A"); v.add("B"); v.add("C"); v.add("D");
Enumeration<String> e = v.elements();
list = Collections.list(e);
System.out.println(list);
[A, B, C, D]
100
101.
Класс Collectionsfrequency
public static int frequency(Collection<?> c, Object o)
Collection<String> collection
= Arrays.asList("red","cyan","red");
System.out.println(
Collections.frequency(collection, "red"));
2
101
102.
Класс Collectionsdisjoin
boolean disjoint(Collection<?> c1, Collection<?> c2)
List<String> srclst = new ArrayList<String>(5);
List<String> destlst = new ArrayList<String>(10);
srclst.add("A"); srclst.add("B");
srclst.add("C"); srclst.add("D");
destlst.add("E"); destlst.add("F");
destlst.add("G");
boolean iscommon = Collections.disjoint(srclst, destlst);
System.out.println(iscommon);
true
102
103.
Класс CollectionsaddAll
<T> boolean addAll(Collection<? super T> c, T... elements)
List<String> arrlist = new ArrayList<String>();
arrlist.add("A"); arrlist.add("B");
arrlist.add("C"); arrlist.add("D");
System.out.println(arrlist);
boolean b = Collections.addAll(arrlist, "1", "2", "3");
System.out.println(arrlist);
[A, B, C, D]
[A, B, C, D, 1, 2, 3]
103
104.
Класс CollectionsnewSetFromMap
public static <E> Set<E> newSetFromMap(Map<E, Boolean> map)
Map<String, Boolean> map = new HashMap<String, Boolean>();
Set<String> set = Collections.newSetFromMap(map);
set.add("1"); set.add("2");
set.add("3"); set.add("4");
println("Set is: " + set);
println("Map is: " + map);
Set is: [3, 2, 1, 4]
Map is: {3=true, 2=true, 1=true, 4=true}
104
105.
Класс CollectionsasLifoQueue
public static <T> Queue<T> asLifoQueue(Deque<T> deque)
Deque<Integer> deque = new ArrayDeque<Integer>(7);
deque.add(1);
deque.add(2);
deque.add(3);
deque.add(4);
deque.add(5);
Queue<Integer> nq = Collections.asLifoQueue(deque);
System.out.println(nq);
[1, 2, 3, 4, 5]
105
106.
СПАСИБО ЗА ВНИМАНИЕ!ВОПРОСЫ?
Java
Collections
Author: Olga Smolyakova
Oracle Certified Java 6 Programmer
[email protected]
106