1. 程式人生 > 其它 >Android 許可權

Android 許可權

技術標籤:Javajava資料結構

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

。因此,需要在呼叫next方法前呼叫hasNext方法,返回true時呼叫next方法。remove方法會刪除上次呼叫next方法時返回的元素,例如若要刪除兩個相鄰元素,必須先呼叫next方法。

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值
  • 可以對元素進行排序
  • 無序集合(插入和遍歷順序不一致)

未完待續…