Java 基礎 - 集合

來源:互聯網
上載者:User

標籤:使用   沒有   []   .so   bool   hashset   table   list   為什麼   

Collection

            

Collection 集合

在 java.util 包中, 其中 Collection 包含:

  • List: 必須按特定的順序容納元素
  • Set: 不可包含任何重複的元素

注意: Map 不在 Collection 集合中.

Collection的主要方法

  • Boolean add(Object): 如果沒添加, 則返回 false(Set 常用)
  • Boolean addAll(Collection)
  • void clear(): 清除所有
  • Boolean contains(Object): 包含(通過比較equals)則返回true
  • Boolean containsAll(Collection): 如果包含所有, 則返回true
  • Boolean isEmpty(): 沒有元素返回true
  • Iterator iterator(): 返回迭代器,  Collection 唯一的迭代方法
  • Boolean remove(Object)true 代表有刪除動作
  • Boolean removeAll(Collection)true 代表有刪除動作
  • Boolean retainAll(Collection): 取交集, 有變動返回 true
  • int size()
  • Object[] toArray(): 返回一個數組
  • Object[] toArray(Object[] a)

1.8新特性

  • Spliterator<E> spliterator()
  • Stream<E> stream()
  • Stream<E> parallelStream()
List

List介面 繼承自 Collection 介面, 它保證元素儲存的順序. 實作類別主要有:

  1. ArrayList
  2. LinkedList
ArrayList

特點:

  • 用於替換 Vector
  • 數組實現
  • 提供隨機訪問
  • 查詢快O(1), 插入刪除慢

擴容:

  • 初始值: 0
  • 第一次增長: `minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);
  • 之後是每次 3/2 * oldCapacity + 1: oldCapacity + (oldCapacity >> 1) + 1
LinkedList

特點:

  • 雙向鏈表實現
  • 插入刪除快
  • 隨機尋找慢, 時間複雜度為O(n)
Set

Set介面 繼承自 Collection 介面, 它保證容器內元素唯一性, 不保證順序. Set 中添加的對象, 必須重寫了 equals() 方法(否則只是比較地址), 實作類別有:

  1. HashSet
  2. TreeSet
HashSet

特點:

  • 需要 hashcode
  • 不保證順序
  • 用 HashMap 實現, 每次add操作會調用 map.put(ele, 預定義假對象);
TreeSet

特點: 

  • 保證順序
  • TreeMap 實現, 每次add操作會調用 map.put(ele, 預定義假對象);
Map

用於儲存 "索引值對".包含:

  1. HashMap
  2. TreeMap
HashMap

特點:

  1. 用於代替 Hashtable
  2. 需要重寫 hashCode() 和 equals()
  3. 不保證順序
  4. put() 和 get() 為常數時間

擴容:

  1. 初始值: 16, 負載因子為0.75, 初始閥值為 16*0.75
  2. 每次擴容, Capacity 加倍

Hashtable區別:

  1. 非安全執行緒, 要外部(調用者)保證安全執行緒
  2. 允許存放 <null, null>

影響HashMap效能的參數:

初始大小負載因子, 當(索引值對數 > 總槽數 * 負載因子), 就會進行 rehash()

如何有效地減少rehash 操作, 以提高HashMap效能? 1. 在設定初始大小的時候, 要考慮實際要儲存多少元素, 以及增長因子(什麼時候擴容), 這樣的話, 就可以減少 rehash 的次數. 2. 當有特別多元素要儲存的時候, 初始值要考慮設定的大一點. 這比每次擴容改變大小效率高很多.

TreeMap

特點: 1. 在 紅-黑 樹的基礎上實現. 2. key 不能為 null, 和 HashMap不同 3. 有 subMap() 方法, 可以返回樹的一部分. 4. put() 和 get() 時間複雜度為 log(N) 5. 需要重寫 equals() 6. 查詢比 HashMap 快

TreeMap 是怎樣排序的?

  1. 建構函式傳入一個 Comparator介面的實現
  2. 儲存的 Object 實現了 Comparable 介面

__Comparator 和 Comparable 有什麼區別? Comparator是外部比較子, 其比較方法compare(T o1, T o2)有兩個參數Comparable 是內部比較子, 起比較方法compareTo(T o) 只有一個參數

常用方法排序和搜尋Array 排序
  1. 調用 Arrays.sort(a, new Comparator(){...})
  2. 假如 Object 實現了 Comparable 可以調用 Arrays.sort(a)
Array 搜尋
  1. 先 sort
  2. 然後調用 Arrays.binarySearch()
List 排序
  • JDK 1.8 之前
    • 先轉化成數組: Object[] a = list.toArray()
    • 調用 Arrays.sort(a, new Comparator(){...}), 假如 Object 實現了 Comparable 可以調用 Arrays.sort(a)
  • JDK 1.8 之後, 可調用 void sort(Comparator c) 方法
  • 調用 Collections.sort(List l)方法
List 搜尋

Collections.binarySearch(List, Object)

Set
  • 轉化成數組排序
    • 先轉化成數組: Object[] a = list.toArray()
    • 調用 Arrays.sort(a, new Comparator(){...}), 假如 Object 實現了 Comparable 可以調用 Arrays.sort(a)
  • 將 HashSet 轉化成 TreeSet
Map
  • 將 HashMap 轉化成 TreeMap
其他實用方法Collections
  1. enumeration(Collection)
  2. max(Collection)
  3. min(Collection)
  4. max(Collection, Comparator)
  5. min(Collection, Comparator)
  6. nCopies(int n, Object o): 返回一個不可邊的List, 列表內的元素都指向 o
  7. unmodifiedbleCollection(Collection): 返回一個不可邊的 Collection
  8. synchronizedList(List)
  9. synchronizedSet(Set)
  10. synchronizedMap(Map)

Enumeration和Iterator介面的區別?

Enumeration的速度是Iterator的兩倍,也使用更少的記憶體。Enumeration是非常基礎的,也滿足了基礎的需要。但是,與Enumeration相比,Iterator更加安全,因為當一個集合正在被遍曆的時候,它會阻止其它線程去修改集合。

迭代器取代了Java集合架構中的Enumeration。迭代器允許調用者從集合中移除元素,而Enumeration不能做到。為了使它的功能更加清晰,迭代器方法名已經經過改善。

其他容器Array

優點: 可以容納基礎資料型別 (Elementary Data Type) 缺點: 提前分配空間

Vector, Stack, HashtableVector

特點: 

  • 實現了 List 介面
  • 安全執行緒, 方法都由 synchronized 標識, 有顯著的效能開銷
  • 內部用數組實現

擴容:

  • 初始值: 10 (預設建構函式)
  • 每次擴容: old + (capacityIncrement==0 ? 0 : oldCapacity) + 1
Stack

特點:

  • 繼承自 Vector
  • 先入後出(LIFO)

擴容, 同 Vector

Hashtable

特點:

  • 實現了 Map 介面
  • 儲存 key-value 對
  • 用內部類 Entry<K,V>(實現Map.Entry<K,V>介面) 數組 + 外部拉鏈法
  • 安全執行緒, 通過為方法上加 synchronized 保證

擴容:

  • 初始值: 11 (預設建構函式), 負載因子: 0.75
  • 擴容條件: 每次 rehash() 都會擴容
  • rehash 條件: count >= thresholdthreshold值為: 當前大小 * 負載因子
  • 每次擴容: newCapacity = (oldCapacity << 1) + 1
  • 最大不超過 MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8最大值-8)

預設的 hashcode 是多少?

hashcode預設值是由 Objecthashcode產生的, 值是這個對象的地址. 

為什麼要存到 HashMap/HashList/Hashtable 中的對象要重寫 equals 和 hashcode?

  1. hashcode 預設值是對象的地址, 假如一個對象在 Hashtable 中, 拿另外一個相等的對象尋找, 會無法在 Hashtable 中檢索到, 因為兩個對象地址不同, 所以檢索到的 enties[index] 不同.

  2. 之所以要重寫 equals, 是因為雖然通過 hashcode 可以找到正確的 entries[index], 但是在鏈表中找相等元素, 是比較 equals 方法.

Java 基礎 - 集合

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.