什麼是算法算法
算法的五個特徵:有窮性,肯定性,可行性,有輸入,有輸出數組
算法的設計原則:正確性,可讀性,健壯性bug/高效率與低存儲。內存+cpu內存佔用最小。緩存
評價算法的兩個重要指標:時間複雜度(運行一個程序花費的時間),空間複雜度(運行程序所須要的內存 OOM 通常就是找數組容器等)。安全
1.常數性時間複雜度0(1)數據結構
及運行代碼:多線程
2.線性性0(m)併發
線性性O(m)高併發
3.性能
對數性 nlog(n) 快速排序優化
4.
平方性
5.
時間複雜度優化標準就是:儘可能往低的優化,通常在程序中找for while 遞歸等就能大概算出時間複雜度。
以上幾個性能對比:O(1)>O(n)>O(nlogn)>O(n^2)
什麼是數據結構
數據結構是計算機存儲、組織數據的方式,指相互之間存在一種或多種特定關係的數據元素的集合。一般狀況下,精心選擇的數據結構能夠帶來更高的運行或者存儲效率。
基礎數據結構
1.數組
元素之間能夠快速的隨機訪問
每一個元素都必須是連續的,當須要擴容時,就須要將已有的數據複製到已有的存儲空間
ArrayList:使用最多的數據結構,訪問快,線程不安全
Vector:線程安全,通常用在高併發系統中
2.鏈表
不能夠隨機訪問 插入刪除快
LinkedList:不能隨機訪問
3.Vector,LinkedList,ArrayList三者的區別
性能上來講,ArrayList最好,也是使用最多。
當集合中的元素須要頻繁的插入刪除的話 能夠考慮使用LinkedList
Vector是線程同步的,因此性能最差,可是安全性最高,通常用於高併發
若是能用數組的時候(元素類型固定,數組長度固定),請儘可能使用數組來代替List;
若是沒有頻繁的刪除插入操做,又不用考慮多線程問題,優先選擇ArrayList;
若是在多線程條件下使用,考慮Vector;
若是須要頻繁地刪除插入,LinkedList;
若是不清楚的狀況下,就用ArrayList。
Set:
Set用來去重
Set 在Java裏面有3種實現方式
(1)HashSet 就是用來去重的 並且去重後元素的順序和插入的不同的
(2)TreeSet 是用來排序的,其底層數據結構爲紅黑樹 元素的順序和插入的不同的
(3)LinkedHashSet 維護了一個鏈表,記錄了順序,能夠保持插入和輸出後的順序一致
隊列
隊列在項目中使用很是普遍主要有如下一些場景:
(1)等待隊列
(2)//排隊場景 若是一個系統流量高 要作這種排隊系統
(3)//Mq消息隊列
Java中有不少種隊列的實現方式,大部分狀況下只須要掌握如下幾個:
ArrayBlockingQueue:基於數組的阻塞隊列實現,也長度是須要定義的,能夠指定先講先出或者先講後出,是有界隊列,在多線程池中的等待隊列就就用了這種。
LinkedBlockingQueue:基於鏈表的阻塞隊列,〈該隊列由一個鏈表構成),
其內部實現採用分離鎖(讀寫分離兩個鎖),從而實現生產者和消費者操做的徹底並行運行,是無界隊列。
PriorityBlockingQueue:基於優先級的阻塞隊列(排隊場景比較適合,具體實現看代碼例子)
DelayQueue:帶有延遲時間的Queue,其中的元素只有當其指定的延遲時間到了,
纔可以從隊列中獲取到該元素。應用場景主要有:緩存超時的數據進行移除、空閒鏈接的關閉等等。
參考子龍老師的課件