首先看看collections實現
publicstatic
void sort(listlist, comparator<? super t>c)
public
static
extends comparable<? super t>> void sort(listlist)
collections的實現可以看出,排序實現分為兩種:是否實現了comparator的介面
接下來看看list.sort的具體實現
defaultvoid sort(comparator<? super e>c)
}
list的實現是通過arrays的排序實現的,然後再通過遍歷器將資料資料插入到原有的list當中去
接下來看看array是的原始碼
arrays的排序實現分為4種情況:
對上圖幾點說明:
從上圖可以看出排序有乙個是否使用以前的排序方式,這個是1.8相容1.6的排序方式;
不論是否實現了comparator介面,後續的排序都是使用了折半插入排序,但是在不同的類裡面實現的,這個主要區別是比較的物件是否實現了comparable介面;
1.6的排序方式是歸併排序,而1.7以後的是折半插入排序,至於為什麼還沒有弄明白,估計是歸併排序的缺點才放棄的吧。雖然歸併排序很穩定,但是需要的輔助空間太大;那為什麼選擇折半插入的原因可能是除了歸併之外的其他穩定排序的幾種方式裡面快排不穩定,基數排序太特殊,但是堆排序個人感覺比折半還是好點,為什麼沒用就不清楚了。
arrays的具體實現大家可以看一下原始碼,這裡就不貼出來了。
JDK1 8中的陣列排序
根據不同的情況,選擇不同的排序演算法。1 當需要排列的元素較少的時候,採用普通的插入排序 當被排序的陣列長度小於47但排序不是從陣列起始位置開始的時候,那麼就會選擇哨兵插入排序的方式進行排序。這種情況主要是當sort被雙基準快排遞迴呼叫的時候才會使用 2 如果元素較多,大於插入排序的閾值,但是小於歸...
Jdk1 8中的LinkHashMap實現原理
linkedhashmap繼承自hashmap,是hash表和煉表的實現,並且依靠著雙向鍊錶保證了迭代順序是插入的順序。如果 乙個key重新插入到linkedhashmap中,那麼這個插入順序是無效的,也就是說,如果m.put k,v 時,呼叫m.containskey k 將會返回true,更新v...
jdk1 8常用總結
1.查詢集合裡的第乙個物件 filter 例 查詢listlist 中username為小明的物件t list.stream filter findfirst 1 list.stream filter e 小明 equals e.getusername findfirst 2.查詢滿足條件的物件,並...