服務自動降級nginx+lua
# [Java 集合框架](https://www.pdai.tech/md/java/collection/java-collection-all.html)
## 1.關於容器
容器就是可以容納其他Java物件的物件,*Java Collections Framework(JCF)* 提供了通用的容器
優點是:
降低程式設計難度和學習難度,提高程式效能
增加程式的重用性
提高API之間的互操作性
Java容器中只能放物件,對於基本型別要把其包裝成物件(包裝類)才能放到容器裡
> **容器主要包括 Collection 和 Map 兩種,Collection 儲存著物件的集合,而 Map 儲存著鍵值對(兩個物件)的對映表。**
## 2.Collection
### Set:無序,唯一
Set繼承Collection介面,是一個不允許出現重複元素,並且無序的集合,主要有TreeSet和HashSet。
在判斷重複元素時,Set集合會呼叫hashCode()和equal方法實現。
#### TreeSet
基於紅黑樹實現,每一個元素都是樹中的一個節點,插入的元素都會進行排序。查詢效率不如HashSet,HashSet查詢時間複雜度為O(1),
TreeSet查詢時間複雜度為O(logN)。
#### HashSet
雜湊表結構,支援快速查詢。主要利用HashMap的key來儲存元素,計算插入元素的hashCode來獲取元素在集合中的位置。失去了元素的插入順序資訊,也就是說使用 Iterator 遍歷 HashSet 得到的結果是不確定的
HashSet底層由HashMap實現,插入元素被當作是HashMap的key,根據hashCode值來確定集合中的位置,由於Set集合中並沒有下標的概念,所以並沒有像List一樣提供get()方法。**當獲取HashSet中某個元素時,只能通過遍歷集合的方式進行equals()比較來實現**。
> **如果你知道是Set,但是不知道是哪個Set,就用HashSet。**
##### LinkedHashSet
具有HashSet的查詢效率,且內部使用雙向連結串列維護元素的插入順序
### List:有序,可重複
#### ArrayList
基於動態陣列實現,支援隨機訪問。
查詢快,增刪慢;執行緒不安全,效率高
> **如果你知道是List,但是不知道是哪個List,就用ArrayList。**
#### Vector
和ArrayList類似,但他是執行緒安全的,效率低
#### LinkedList
基於雙向連結串列實現,只能順序訪問,但是可以快速地在連結串列中插入和刪除元素。不僅如此,LinkedList還可以用作棧,佇列和雙向佇列。
查詢慢,增刪快;執行緒不安全,效率高
## 3.Map
Map介面有三個比較重要的實現類,分別是HashMap、TreeMap和HashTable
### TreeMap
基於紅黑樹實現,有序
### HashMap
基於雜湊表實現,執行緒不安全,效率高。如果對同步性或與遺留程式碼的相容性沒有任何要求,建議使用HashMap
HashMap允許null值(key和value都允許)
現在可以使用 ConcurrentHashMap 來支援執行緒安全,並且 ConcurrentHashMap 的效率會更高,因為 ConcurrentHashMap 引入了分段鎖
### HashTable
和HashMap類似,但他是執行緒安全的,Hashtable不允許null值
# 問題分析
## (一) TreeSet,LinkedHashSet和HashSet的區別
**相同點**:都實現Set介面,三者都不是執行緒安全的,如果要使用執行緒安全可以使用Collection.synchronizedSet()
**不同點**:HashSet插入資料最快,其次是LinkedHashSet,最慢的是TreeSet因為內部實現排序
HashSet不保證有序,LinkedHashSet保證FIFO即按插入順序排序,TreeSet按照內部規則排序,也可自定義排序規則
HashSet和LinkedHashSet允許存在null資料,但TreeSet中插入null資料時會報NullPointerException