1. 程式人生 > 其它 >服務自動降級nginx+lua

服務自動降級nginx+lua

容器就是可以容納其他Java物件的物件,*Java Collections Framework(JCF)* 提供了通用的容器

# [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