java裡面陣列簡單認識
陣列認識:
陣列申請記憶體時,在空間上是連續的(如何證明陣列在空間連續呢),陣列的優點主要是查詢比較快
jdk中的陣列:
java替我們封裝了許多內建物件,我們只需要傳遞引數就可以,例如:Arrays物件
構造方法:
分析:可以看出構造方法被私有化,這樣我們就不會產生新的物件,只能呼叫裡面的靜態方法。
rangeCheck方法:
jdk1.7 使用的是快速排序
快速排序的基本思想:
首先選擇一個基準點,這個基準點選擇可能影響快速排序的速度(固定基準點,隨機基準點,三數取中),然後用head和last所對應的值,用last值和基準點進行比較,如果小於基準值,就交換head和last所對應的元素,再接下來就用head的值和基準值比較,如果head的值大於基準值,就進行交換所head和last的值,直到head>=last(遞迴結束條件),一次比較完成。
1. 這個程式使用的是快速排序和遞迴,那麼遞迴最重要的是,遞迴的結束條件,以及遞迴如何在記憶體裡面執行(正在研究)。
2. 選取一個基準值,採用固定切分發(這個效率可能不是特別高)。
3. 思想就是把大於基準值的放在右邊,小於基準值放在左邊。
jdk1.8 增加新特性並行排序,Arrays.parallelSort使用了Java7的Fork/Join框架使排序任務可以線上程池中的多個執行緒中進行,Fork/Join實現了一種任務竊取演算法,一個閒置的執行緒可以竊取其他執行緒的閒置任務進行處理。(這個將在後面的多執行緒中討論)
ArrayList認識
1. 從上面原始碼中,我們可以看出最基本的資訊ArrayList提供三種初始化方式
2. elementData來儲存陣列資訊,並且用transient來修飾。
分析:為什麼要使用transient來修飾elementData
首先我們解釋transient作用,它主要是在序列化過程中時不序列化transient修飾的成員變數,但是問題是elementData儲存我們的
資料,那麼我們的資料將會在序列化的過程中去哪裡了,我們看ArrayList原始碼發現它實現序列化介面,裡面實現兩個方法writeObject和readObject,但是這兩個方法的作用是什麼呢,就是在序列化過程中不把整個elementData序列化,因為可能我們沒有用完的空間,那麼這兩個方法將幫助我們序列化我們需要的資料。