文章目錄
簡介
所有的集合類都位於java.util包下,後來爲了處理多線程環境下的併發安全問題,Java 5還在java.util.concurrent包下提供了一些多線程支持的集合類。
Java的集合類主要由兩個接口派生而出:Collection和Map,是Java集合框架的根接口,這兩個接口又包含了一些子接口或實現類。
Collection
子接口如下所示:
- Set(無序,元素不可重複)
- List(有序,元素可以重複)
- Queue(隊列)
Collection接口定義的方法:
// java.util
public interface Collection<E> extends Iterable<E>
int size();
boolean isEmpty();
boolean contains(Object o);
// 返回Iterator對象,用於遍歷集合裏的元素。
Iterator<E> iterator();
// 將集合轉換成數組
Object[] toArray();
Iterator<E> iterator();
boolean add(E e);
boolean remove(Object o);
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? entends E> c);
// 取交集
boolean retainAll(Collection<?> c);
void clear();
遍歷集合
- Java 8使用Lambda表達式來遍歷集合元素(Iterable接口新增forEach默認方法)
- Iterator(迭代器)
- Java 5提供foreach
Iterator
Iterator僅用於遍歷集合,Iterator本身並不提供盛裝對象的能力。如果需要創建Iterator對象,則必須有一個被迭代的集合。
// java.util
public interface Iterator<E>
// 如果被迭代的集合元素還沒有被遍歷完,則返回true
boolean hasNext();
// 返回集合裏的下一個元素
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
// java 8爲Iterator新增的默認方法
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
**注:**Iterator迭代訪問Collection集合元素時,Collection集合裏的元素不能被改變。
List
元素有序、可重複的集合。
public interface List<E> extends Collection<E>
ArrayList
線程不安全
LinkedList
LinkedList與ArrayList、ArrayDeque的實現機制完全不同,後者內部以數組的形式來保存集合中的元素,隨機訪問有較好性能;而LinkedList內部以鏈表的形式來保存元素,插入、刪除元素時性能比較好。
Vector
線程安全,比ArrayList的性能低。子類Stack
Set
HashSet
LinkedHashSet
SortedSet(接口)
TreeSet
EnumSet
Queue
PriorityQueue
Deque(接口)
雙端隊列。
ArrayDeque
ArrayList和ArrayDeque兩個集合類的實現機制基本相似,底層都採用一個動態的、可重分配的Object[]數組來存儲集合元素,當集合元素超出了該數組的容量時,系統會在底層重新分配一個Object[]數組來存儲集合元素。
Map
Map保存的每項數據都是key-value對。Map中key是不可以重複的,key用於標識集合裏的每項數據。
HashMap
- 線程不安全
- 可以使用null作爲key或value。
LinkedHashMap
父類爲HashMap
SortedMap(接口)
實現類TreeMap。
TreeMap
TreeMap就是一個紅黑樹數據結構,每個key-value對即作爲紅黑樹的一個節點。