迭代器,全部的collection集合相關的類均可以使用迭代器遍歷。迭代器Iterator是一個接口,它提供的API有:css
abstract boolean hasNext()
abstract E next()
abstract void remove()
listIterator是一個接口,繼承了Iterator接口。因爲這個迭代器只適用於List接口的實現類,由list的特殊性,這個迭代器在list的基礎上增長了許多方法:html
在Iterator的基礎上,新增的方法有:java
abstract void add(E object)
abstract boolean hasPrevious()
abstract int nextIndex()
abstract E previous()
abstract int previousIndex()
abstract void set(E object)
Map的API:node
abstract void clear()
abstract boolean containsKey(Object key)
abstract boolean containsValue(Object value)
abstract Set<Entry<K, V>> entrySet()
abstract boolean equals(Object object)
abstract V get(Object key)
abstract int hashCode()
abstract boolean isEmpty()
abstract Set<K> keySet()
abstract V put(K key, V value)
abstract void putAll(Map<? extends K, ? extends V> map)
abstract V remove(Object key)
abstract int size()
abstract Collection<V> values()
有一部分來自於collection接口。程序員
關於MAPMap提供接口分別用於返回 鍵集、值集或鍵-值映射關係集。web
由於Map中不能包含重複的鍵;每一個鍵最多隻能映射到一個值。因此,鍵-值集、鍵集都是Set,值集時Collection。面試
Map提供了「鍵-值對」、「根據鍵獲取值」、「刪除鍵」、「獲取容量大小」等方法。編程
package com.xzj;
import java.awt.*;
import java.util.*;
import java.util.Map.Entry;
// @ author :zjxu time:2019-01-14
public class Main {
public static void main(String[] args) {
Map<String, Point> hashMap = new HashMap<>();
hashMap.put("xzj", new Point(23, 326));
hashMap.put("xxx", new Point(23, 325));
hashMap.put("yyy", new Point(23, 324));
hashMap.put("zzz", new Point(23, 327));
Collection<Point> values = hashMap.values();
Iterator iteratorValue = values.iterator();
while (iteratorValue.hasNext()) {
System.out.println(iteratorValue.next().toString());
}
Set<Entry<String, Point>> entrySet = hashMap.entrySet();
Iterator<Entry<String, Point>> iteratorEntry = entrySet.iterator();
while (iteratorEntry.hasNext()) {
System.out.println(iteratorEntry.next().toString());
}
}
}
SortedMap是一個繼承於Map接口的接口。它是一個有序的SortedMap鍵值映射。SortedMap的排序方式有兩種:天然排序 、 用戶指定比較器。windows
插入有序 SortedMap 的全部元素都必須實現 Comparable 接口(或者被指定的比較器所接受)。數組
另外,全部SortedMap 實現類都應該提供 4 個「標準」構造方法:
NavigableMap是繼承於SortedMap的接口。它是一個可導航的鍵-值對集合,具備了爲給定搜索目標報告最接近匹配項的導航方法。 NavigableMap分別提供了獲取「鍵」、「鍵-值對」、「鍵集」、「鍵-值對集」的相關方法。
API以下:
abstract Entry<K, V> ceilingEntry(K key)
abstract Entry<K, V> firstEntry()
abstract Entry<K, V> floorEntry(K key)
abstract Entry<K, V> higherEntry(K key)
abstract Entry<K, V> lastEntry()
abstract Entry<K, V> lowerEntry(K key)
abstract Entry<K, V> pollFirstEntry()
abstract Entry<K, V> pollLastEntry()
abstract K ceilingKey(K key)
abstract K floorKey(K key)
abstract K higherKey(K key)
abstract K lowerKey(K key)
abstract NavigableSet<K> descendingKeySet()
abstract NavigableSet<K> navigableKeySet()
abstract NavigableMap<K, V> descendingMap()
abstract NavigableMap<K, V> headMap(K toKey, boolean inclusive)
abstract SortedMap<K, V> headMap(K toKey)
abstract SortedMap<K, V> subMap(K fromKey, K toKey)
abstract NavigableMap<K, V> subMap(K fromKey, boolean fromInclusive, K toKey, boolean toInclusive)
abstract SortedMap<K, V> tailMap(K fromKey)
abstract NavigableMap<K, V> tailMap(K fromKey, boolean inclusive)
其中的API大體分爲以下幾類:
提供操做鍵-值對的方法。
提供操做鍵的方法。這個和第1類比較相似。
獲取鍵集。
獲取鍵-值對的子集。
AbstractMap實現了Map、接口中的大部分方法。然後添加了一個entrySet的方法。沒有繼承這個抽象類的HashTable沒有這個方法。
abstract Set<Entry<K, V>> entrySet()
void clear()
boolean containsKey(Object key)
boolean containsValue(Object value)
boolean equals(Object object)
V get(Object key)
int hashCode()
boolean isEmpty()
Set<K> keySet()
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> map)
V remove(Object key)
int size()
String toString()
Collection<V> values()
Object clone()
API以下:
Entry<K, V> ceilingEntry(K key)
K ceilingKey(K key)
void clear()
Object clone()
Comparator<? super K> comparator()
boolean containsKey(Object key)
NavigableSet<K> descendingKeySet()
NavigableMap<K, V> descendingMap()
Set<Entry<K, V>> entrySet()
Entry<K, V> firstEntry()
K firstKey()
Entry<K, V> floorEntry(K key)
K floorKey(K key)
V get(Object key)
NavigableMap<K, V> headMap(K to, boolean inclusive)
SortedMap<K, V> headMap(K toExclusive)
Entry<K, V> higherEntry(K key)
K higherKey(K key)
boolean isEmpty()
Set<K> keySet()
Entry<K, V> lastEntry()
K lastKey()
Entry<K, V> lowerEntry(K key)
K lowerKey(K key)
NavigableSet<K> navigableKeySet()
Entry<K, V> pollFirstEntry()
Entry<K, V> pollLastEntry()
V put(K key, V value)
V remove(Object key)
int size()
SortedMap<K, V> subMap(K fromInclusive, K toExclusive)
NavigableMap<K, V> subMap(K from, boolean fromInclusive, K to, boolean toInclusive)
NavigableMap<K, V> tailMap(K from, boolean inclusive)
SortedMap<K, V> tailMap(K fromInclusive)
HashMap 的實例有兩個參數影響其性能:「初始容量」 和 「加載因子」。容量 是哈希表中桶的數量,初始容量 只是哈希表在建立時的容量。加載因子 是哈希表在其容量自動增長以前能夠達到多滿的一種尺度。當哈希表中的條目數超出了加載因子與當前容量的乘積時,則要對該哈希表進行 rehash 操做(即重建內部數據結構),從而哈希表將具備大約兩倍的桶數。 一般,默認加載因子是 0.75, 這是在時間和空間成本上尋求一種折衷。加載因子太高雖然減小了空間開銷,但同時也增長了查詢成本(在大多數 HashMap 類的操做中,包括 get 和 put 操做,都反映了這一點)。在設置初始容量時應該考慮到映射中所需的條目數及其加載因子,以便最大限度地減小 rehash 操做次數。若是初始容量大於最大條目數除以加載因子,則不會發生 rehash 操做。
API以下:
void clear()
Object clone()
boolean containsKey(Object key)
boolean containsValue(Object value)
Set<Entry<K, V>> entrySet()
V get(Object key)
boolean isEmpty()
Set<K> keySet()
V put(K key, V value)
void putAll(Map<? extends K, ? extends V> map)
V remove(Object key)
int size()
Collection<V> values()
Map基本均可以使用HashMap,不過HashMap有一個問題,就是迭代HashMap的順序並非HashMap放置的順序,也就是無序。HashMap的這一缺點每每會帶來困擾,由於有些場景,咱們期待一個有序的Map。
這個時候,LinkedHashMap就閃亮登場了,他繼承自HashMap,雖然增長了時間和空間上的開銷,可是經過維護一個運行於全部條目的雙向鏈表,LinkedHashMap保證了元素迭代的順序。該迭代順序能夠是插入順序或者是訪問順序。
關 注 點 | 結 論 |
---|---|
LinkedHashMap是否容許空 | Key和Value都容許空 |
LinkedHashMap是否容許重複數據 | Key重複會覆蓋、Value容許重複 |
LinkedHashMap是否有序 | 有序 |
LinkedHashMap是否線程安全 | 非線程安全 |
一、LinkedHashMap能夠認爲是HashMap+LinkedList,即它既使用HashMap操做數據結構,又使用LinkedList維護插入元素的前後順序。
二、LinkedHashMap的基本實現思想就是----多態。能夠說,理解多態,再去理解LinkedHashMap原理會事半功倍;反之也是,對於LinkedHashMap原理的學習,也能夠促進和加深對於多態的理解。
因爲HashMap和HashTable的特殊關係,這裏就只討論兩者區別。
HashMap和Hashtable的比較是Java面試中的常見問題,用來考驗程序員是否可以正確使用集合類以及是否能夠隨機應變使用多種思路解決問題。HashMap的工做原理、ArrayList與Vector的比較以及這個問題是有關Java 集合框架的最經典的問題。Hashtable是個過期的集合類,存在於Java API中好久了。在Java 4中被重寫了,實現了Map接口,因此自此之後也成了Java集合框架中的一部分。Hashtable和HashMap在Java面試中至關容易被問到,甚至成爲了集合框架面試題中最常被考的問題,因此在參加任何Java面試以前,都不要忘了準備這一題。
HashMap和Hashtable都實現了Map接口,但決定用哪個以前先要弄清楚它們之間的分別。主要的區別有:線程安全性,同步(synchronization),以及速度。
HashMap能夠經過下面的語句進行同步: Map m = Collections.synchronizeMap(hashMap);
Collection是一個接口,其下有兩個接口和(List接口和Set接口)一個抽象類(AbstractCollection)。
因爲Collection實現了Iterator接口,因此collection全部的實現類對象,均可以使用迭代器Iterator遍歷
collection提供的API以下:
abstract boolean add(E object)
abstract boolean addAll(Collection<? extends E> collection)
abstract void clear()
abstract boolean contains(Object object)
abstract boolean containsAll(Collection<?> collection)
abstract boolean equals(Object object)
abstract int hashCode()
abstract boolean isEmpty()
abstract Iterator<E> iterator()
abstract boolean remove(Object object)
abstract boolean removeAll(Collection<?> collection)
abstract boolean retainAll(Collection<?> collection)
abstract int size()
abstract <T> T[] toArray(T[] array)
abstract Object[] toArray()
全部的Collection的實現類的構造方法,均可以使用另外一個Collection的對象做爲參數,添加進去,從而構造一個新的collection對象。也就是說,能夠經過構造方法,將一個collection的對象,轉化成另外一種集合類對象。
package com.xzj;
import java.awt.*;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
// @ author :zjxu time:2019-01-14
public class Main {
public static void main(String[] args) {
ArrayList<Point> arrayList = new ArrayList<>();
arrayList.add(new Point(0, 3));
arrayList.add(new Point(1, 2));
Set<Point> set = new HashSet(arrayList);
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next().toString());
}
}
}
list是一個接口,抽象類AbstractList實現了這個接口和AbstractCollection這個抽象類。
list是一個有序的隊列 。其中的每個元素都有本身的index,從’0’開始,依次增長。因爲序列性,可使用for-index遍歷。
list中能夠存在重複的元素。
list中容許使用空元素
list在collection的基礎上添加的API以下:
abstract void add(int location, E object)
abstract boolean addAll(int location, Collection<? extends E> collection)
abstract E get(int location)
abstract int indexOf(Object object)
abstract int lastIndexOf(Object object)
abstract ListIterator<E> listIterator(int location)
abstract ListIterator<E> listIterator()
abstract E remove(int location)
abstract E set(int location, E object)
abstract List<E> subList(int start, int end)
繼承圖:
ArrayList的API以下:
// Collection中定義的API
boolean add(E object)
boolean addAll(Collection<? extends E> collection)
void clear()
boolean contains(Object object)
boolean containsAll(Collection<?> collection)
boolean equals(Object object)
int hashCode()
boolean isEmpty()
Iterator<E> iterator()
boolean remove(Object object)
boolean removeAll(Collection<?> collection)
boolean retainAll(Collection<?> collection)
int size()
<T> T[] toArray(T[] array)
Object[] toArray()
// AbstractCollection中定義的API
void add(int location, E object)
boolean addAll(int location, Collection<? extends E> collection)
E get(int location)
int indexOf(Object object)
int lastIndexOf(Object object)
ListIterator<E> listIterator(int location)
ListIterator<E> listIterator()
E remove(int location)
E set(int location, E object)
List<E> subList(int start, int end)
// ArrayList新增的API
Object clone()
void ensureCapacity(int minimumCapacity)
void trimToSize()
void removeRange(int fromIndex, int toIndex)
vector的繼承圖:
API:
synchronized boolean add(E object)
void add(int location, E object)
synchronized boolean addAll(Collection<? extends E> collection)
synchronized boolean addAll(int location, Collection<? extends E> collection)
synchronized void addElement(E object)
synchronized int capacity()
void clear()
synchronized Object clone()
boolean contains(Object object)
synchronized boolean containsAll(Collection<?> collection)
synchronized void copyInto(Object[] elements)
synchronized E elementAt(int location)
Enumeration<E> elements()
synchronized void ensureCapacity(int minimumCapacity)
synchronized boolean equals(Object object)
synchronized E firstElement()
E get(int location)
synchronized int hashCode()
synchronized int indexOf(Object object, int location)
int indexOf(Object object)
synchronized void insertElementAt(E object, int location)
synchronized boolean isEmpty()
synchronized E lastElement()
synchronized int lastIndexOf(Object object, int location)
synchronized int lastIndexOf(Object object)
synchronized E remove(int location)
boolean remove(Object object)
synchronized boolean removeAll(Collection<?> collection)
synchronized void removeAllElements()
synchronized boolean removeElement(Object object)
synchronized void removeElementAt(int location)
synchronized boolean retainAll(Collection<?> collection)
synchronized E set(int location, E object)
synchronized void setElementAt(E object, int location)
synchronized void setSize(int length)
synchronized int size()
synchronized List<E> subList(int start, int end)
synchronized <T> T[] toArray(T[] contents)
synchronized Object[] toArray()
synchronized String toString()
synchronized void trimToSize()
繼承圖:
LinkedList的本質是雙向鏈表。
API:
boolean add(E object)
void add(int location, E object)
boolean addAll(Collection<? extends E> collection)
boolean addAll(int location, Collection<? extends E> collection)
void addFirst(E object)
void addLast(E object)
void clear()
Object clone()
boolean contains(Object object)
Iterator<E> descendingIterator()
E element()
E get(int location)
E getFirst()
E getLast()
int indexOf(Object object)
int lastIndexOf(Object object)
ListIterator<E> listIterator(int location)
boolean offer(E o)
boolean offerFirst(E e)
boolean offerLast(E e)
E peek()
E peekFirst()
E peekLast()
E poll()
E pollFirst()
E pollLast()
E pop()
void push(E e)
E remove()
E remove(int location)
boolean remove(Object object)
E removeFirst()
boolean removeFirstOccurrence(Object o)
E removeLast()
boolean removeLastOccurrence(Object o)
E set(int location, E object)
int size()
<T> T[] toArray(T[] contents)
Object[] toArray()
繼承圖:
Stack是棧。它的特性是:先進後出(FILO, First In Last Out)。
java工具包中的Stack是繼承於Vector(矢量隊列)的,因爲Vector是經過數組實現的,這就意味着,Stack也是經過數組實現的,而非鏈表。固然,咱們也能夠將LinkedList看成棧來使用!
因爲Stack和繼承於Vector,所以它也包含Vector中的所有API。
其中經常使用的API以下:
boolean empty()
synchronized E peek()
synchronized E pop()
E push(E object)
synchronized int search(Object o)
繼承圖
在Set中,數據存儲的結構是無序的。TreeSet對Set中的元素排序,因爲TreeSet的有序性,因此TreeSet中不容許有空元素的存在。TreeSet中元素排序的方式有兩種:天然排序和比較器排序。排序的結果的存儲結構使用紅黑樹。
1
天然排序方法要求添加進入set的元素自身實現Comparable接口,重寫compareTo方法。按照compareTo規定的排序規則,來對添加進Set的元素排序。
2
比較器排序的方法就是,編寫一個比較器的對象,在初始化的時候,將其加載到TreeSet的構造函數中。這樣,set中的元素就會按照比較器的規則來將插入set中的元素排序。
下面是TreeSet的API:
boolean add(E object)
boolean addAll(Collection<? extends E> collection)
void clear()
Object clone()
boolean contains(Object object)
E first()
boolean isEmpty()
E last()
E pollFirst()
E pollLast()
E lower(E e)
E floor(E e)
E ceiling(E e)
E higher(E e)
boolean remove(Object object)
int size()
Comparator<? super E> comparator()
Iterator<E> iterator()
Iterator<E> descendingIterator()
SortedSet<E> headSet(E end)
NavigableSet<E> descendingSet()
NavigableSet<E> headSet(E end, boolean endInclusive)
SortedSet<E> subSet(E start, E end)
NavigableSet<E> subSet(E start, boolean startInclusive, E end, boolean endInclusive)
NavigableSet<E> tailSet(E start, boolean startInclusive)
SortedSet<E> tailSet(E start)
繼承圖:
HashSet的主要API:
boolean add(E object)
void clear()
Object clone()
boolean contains(Object object)
boolean isEmpty()
Iterator<E> iterator()
boolean remove(Object object)
int size()
Set的結構圖以下:
Queue是一個接口,其下還有Deque、BlockingQueue、AbstractQueue接口。
結構圖:
API以下:
Modifier and Type | Method and Description |
---|---|
boolean |
add(E e) 將指定的元素插入到此優先級隊列中。 |
void |
clear() 今後優先級隊列中刪除全部元素。 |
Comparator<? super E> |
comparator() 返回用於爲了在這個隊列中的元素,或比較null 若是此隊列根據所述排序natural ordering的元素。 |
boolean |
contains(Object o) 若是此隊列包含指定的元素,則返回 true 。 |
Iterator<E> |
iterator() 返回此隊列中的元素的迭代器。 |
boolean |
offer(E e) 將指定的元素插入到此優先級隊列中。 |
E |
peek() 檢索但不刪除此隊列的頭,若是此隊列爲空,則返回 null 。 |
E |
poll() 檢索並刪除此隊列的頭,若是此隊列爲空,則返回 null 。 |
boolean |
remove(Object o) 從該隊列中刪除指定元素的單個實例(若是存在)。 |
int |
size() 返回此集合中的元素數。 |
Spliterator<E> |
spliterator() 在此隊列中的元素上建立late-binding和失敗快速 Spliterator 。 |
Object[] |
toArray() 返回一個包含此隊列中全部元素的數組。 |
<T> T[] |
toArray(T[] a) 返回一個包含此隊列中全部元素的數組; 返回的數組的運行時類型是指定數組的運行時類型。 |