標籤:使用 沒有 [] .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 介面, 它保證元素儲存的順序. 實作類別主要有:
ArrayList
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() 方法(否則只是比較地址), 實作類別有:
HashSet
TreeSet
HashSet
特點:
- 需要
hashcode
- 不保證順序
- 用
HashMap 實現, 每次add操作會調用 map.put(ele, 預定義假對象);
TreeSet
特點:
- 保證順序
TreeMap 實現, 每次add操作會調用 map.put(ele, 預定義假對象);
Map
用於儲存 "索引值對".包含:
- HashMap
- TreeMap
HashMap
特點:
- 用於代替
Hashtable
- 需要重寫
hashCode() 和 equals()
- 不保證順序
put() 和 get() 為常數時間
擴容:
- 初始值: 16, 負載因子為0.75, 初始閥值為 16*0.75
- 每次擴容, Capacity 加倍
與Hashtable區別:
- 非安全執行緒, 要外部(調用者)保證安全執行緒
- 允許存放
<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 是怎樣排序的?
- 建構函式傳入一個
Comparator介面的實現
- 儲存的
Object 實現了 Comparable 介面
__Comparator 和 Comparable 有什麼區別? Comparator是外部比較子, 其比較方法compare(T o1, T o2)有兩個參數Comparable 是內部比較子, 起比較方法compareTo(T o) 只有一個參數
常用方法排序和搜尋Array 排序
- 調用
Arrays.sort(a, new Comparator(){...})
- 假如 Object 實現了
Comparable 可以調用 Arrays.sort(a)
Array 搜尋
- 先 sort
- 然後調用
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
其他實用方法Collections
enumeration(Collection)
max(Collection)
min(Collection)
max(Collection, Comparator)
min(Collection, Comparator)
nCopies(int n, Object o): 返回一個不可邊的List, 列表內的元素都指向 o
unmodifiedbleCollection(Collection): 返回一個不可邊的 Collection
synchronizedList(List)
synchronizedSet(Set)
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
Hashtable
特點:
- 實現了
Map 介面
- 儲存
key-value 對
- 用內部類
Entry<K,V>(實現Map.Entry<K,V>介面) 數組 + 外部拉鏈法
- 安全執行緒, 通過為方法上加
synchronized 保證
擴容:
- 初始值: 11 (預設建構函式), 負載因子: 0.75
- 擴容條件: 每次
rehash() 都會擴容
rehash 條件: count >= threshold, threshold值為: 當前大小 * 負載因子
- 每次擴容:
newCapacity = (oldCapacity << 1) + 1
- 最大不超過
MAX_ARRAY_SIZE(Integer.MAX_VALUE - 8最大值-8)
預設的 hashcode 是多少?
hashcode預設值是由 Object的hashcode產生的, 值是這個對象的地址.
為什麼要存到 HashMap/HashList/Hashtable 中的對象要重寫 equals 和 hashcode?
hashcode 預設值是對象的地址, 假如一個對象在 Hashtable 中, 拿另外一個相等的對象尋找, 會無法在 Hashtable 中檢索到, 因為兩個對象地址不同, 所以檢索到的 enties[index] 不同.
之所以要重寫 equals, 是因為雖然通過 hashcode 可以找到正確的 entries[index], 但是在鏈表中找相等元素, 是比較 equals 方法.
Java 基礎 - 集合