Android 許可權
Collection集合常用方法
boolean add(E e); //向集合中新增元素
boolean remove(E e); //刪除集合中的某個元素
void clear(); //清空集合中所有元素
boolean contains(E e); //判斷集合中是否包含某個元素
boolean isEmpty(); //判斷集合是否為空
int size(); //獲取集合的長度
Object[] toArray(); //將集合轉換成一個數組
迭代器
Collection集合元素的通用獲取方式。在取元素前要判斷集合中有沒有元素。
使用集合中的方法iterator()
獲取迭代器的實現類物件
Iterator 介面包含4個方法
public interface Iterator<E> {
E next();
boolean hasNext();
void remove();
default void forEachRemaining(Consumer<? super E> action);
}
應該將Java迭代器認為是位於兩個元素之間,呼叫next時,迭代器就越過下一個元素,並返回剛剛越過的那個元素的引用。但是到達集合末尾,next方法會丟擲NosuchElementException
iterator.remove();
iterator.next();
iterator.remove();
List介面
特點:
- 有序的集合
- 允許儲存相同的元素
- 有索引,可以使用for迴圈遍歷
ArrayList
特點:底層是陣列實現的,查詢快,增刪慢。
LinkedList
特點:底層是連結串列實現的,查詢慢,增刪快。
在Java程式設計語言中,所有的連結串列實際上都是雙向連結的。
陣列和陣列列表都有一個重大的缺陷:想要從中間位置刪除一個元素要付出很大的代價,其原因是刪除中間元素後,其後的所有元素都要向前端移動。插入一個元素也是如此。
連結串列解決了這個問題
元素刪除與上述一致,這裡需要說明的是,為了實現在任意位置新增元素,集合類庫提供了子介面ListIterator
,其中包含了add方法,與Collection.add
不同,這個方法不返回boolean型別的值,它假定新增操作總會改變連結串列。add方法會在迭代器位置之前新增一個新物件。
另外,ListIterator
介面有兩個方法,可以用來反向遍歷連結串列:
E previous();
boolean hasPrevious();
與next方法一樣,previous方法返回越過的物件。
通過一下程式碼示例來說明:
LinkedList<String> staff = new LinkedList<>();
staff.add("Amy");
staff.add("Bob");
staff.add("Carl");
ListIterator<String> iterator = staff.listIterator();
iterator.next();
iterator.add("Juliet");
iterator.previous();
iterator.remove();
最後的remove方法將剛剛新增進去的“Juliet”刪除了,同樣是刪除previous越過的元素。
簡而言之:add方法只依賴於迭代器的位置,而remove方法依賴於迭代器的狀態
最後還有set方法,用一個新的元素取代呼叫next或previous方法返回的上一個元素。
多個迭代器的使用:
如果迭代器發現它的集合被另一個迭代器修改了,或是被該集合自身的方法修改了,救會丟擲一個ConcurrentModificationException
異常。例如:
List<String> list = ...;
ListIterator<String> iter1 = list.listIterator();
ListIterator<String> iter2 = list.listIterator();
iter1.next();
iter1.remove();
iter2.next();// throws ConcurrentModificationException
為了避免併發修改的異常,可以遵循下述規則:可以給容器附加許多的迭代器,但這些只能讀取列表。再單獨附加一個既能讀又能寫的迭代器
常用方法:
void addFirst(E e); //將指定元素插入到連結串列的頭部
void addLast(E e); //將指定元素插入到連結串列的尾部
void getFirst();
void getLast();
E removeFirst();
E removeLast(); //移除並返回
連結串列也有get方法根據索引來獲取元素,但效率很低,如果要隨機訪問,就不應該使用連結串列。
Set介面
特點:
- 不允許儲存重複的元素
- 沒用索引(不能使用普通的for迴圈遍歷)
HashSet
特點:底層是雜湊表+(紅黑樹)實現的,無索引,不可以儲存重複元素,存取無序。
建構函式:
HashSet(); //構造一個空散列表,預設容量16,裝填因子0.75
HashSet(Collection<? extends E> elements); //構造一個雜湊集,將集合中的元素加到其中
HashSet(int initialCapacity); //構造一個空的具有指定容量的雜湊集
HashSet(int initialCapacity, float loadFactor); //裝填因子(0.0-1.0)
Capacity
如果想要控制散列表的執行效能,就要指定一個初始的桶數(容量)。桶數是指用於收集具有相同雜湊值的桶的數目。(雜湊值與桶的總數取餘,所得到的結果就是儲存這個元素桶的索引,例如,某個物件的雜湊值為76268,並且有128個桶,物件就儲存在76268%128 = 108號桶中)。通常將桶數設定為預計元素個數的75%-150%。引數initialCapacity是2的冪,預設16,例如,及時設定為5,也會被改成8
load factor
如果散列表太滿,就需要再雜湊(rehashed):建立一個桶數更多的表,並將所有元素插入到這個新表中,然後丟棄原來的表。裝填因子(load factor)決定何時進行再雜湊,例如,為0.75(預設值),那麼表中超過75%的位置已經填入元素,這個表就會用雙倍的桶數進行再雜湊。
hashCode
如果自定義類,就要負責實現這個類的hashCode
方法,自己實現的hashCode
方法應該與equals方法相容,即如果a.equals(b)
為true,則a,b必須具有相同的雜湊碼。
LinkedHashSet
特點:底層是雜湊表+連結串列實現的,無索引、不可以儲存重複元素、可以保證存取順序
TreeSet
特點:底層是二叉樹實現,一般用於排序
注意:由於每次插入元素時,都會被放在正確的排序位置上,放入樹集的元素必須實現Comparable
介面,或者構造集時必須提供一個Comparator
Queue&Deque介面
特點:
- 可以在尾部新增一個元素,在頭部刪除一個元素
- 不支援在佇列中間新增元素
- 雙端佇列可以在頭部尾部同時新增或刪除元素
常用方法:
java.util.Queue<E>
boolean offer(E element); //將元素新增到尾端,如果佇列滿了,返回false
E poll(); //刪除並返回佇列頭部的元素,佇列為空則返回null
E peak(); //返回佇列頭部元素(不刪除),為空則返回null
//與上述三個方法類似的有add(),remove()和element方法,但失敗都會丟擲異常
java.util.Deque<E>
boolean offerFirst(E element); //新增到頭部
boolean offerLast(E element); //新增到尾部
E pollFirst();
E pollLast();
E peakFirst();
E peakLast();
PriorityQueue
特點:
- 按任意順序插入,按特定順序檢索(無論何時呼叫remove方法,都會獲得佇列中最小的元素)
- 堆資料結構
- 元素要實現
Comparable
介面,或者構造時必須提供一個Comparator
Map集合
特點:
- 存放鍵/值對,通過唯一的鍵查詢值
常用方法:
V get(Object key); //返回與鍵對應的物件,如果沒有則返回null
default V getOrDefault(Object key,V defaultValue); //如果沒有則返回這個預設值
V put(K key, V value); //存放鍵值對,如果鍵已經存在則覆蓋值,返回原有的值
void putAll(Map<? extends K, ? extends V> entries); //放入給定對映中的所有條目
boolean containsKey(Object key);
boolean containsValue(Object value);
default void forEach(BiConsumer<? super K,? super V> action);
//對所有鍵值對執行這個動作,可以使用lamda表示式
HashMap
特點:
- 允許存入null鍵,null值(null值只有一個,並存於陣列第一個位置)
- 無序集合,而且順序會隨著元素的新增而隨時改變(新增順序,迭代順序不一致)
- 隨著元素的增加而動態擴容(與ArrayList原理一致)
- 不存在重複元素(得益於hashCode演算法和equals方法)
- 執行緒不安全
TreeMap
特點:
- 不允許出現重複的key
- 可以插入null鍵,null值
- 可以對元素進行排序
- 無序集合(插入和遍歷順序不一致)
未完待續…