集合、數據結構、時間復雜度
1、集合
1.1 概述
java集合分為三種類型,List、set和Map。List有序,可以重復。Set無序不重復。Map是Key-value對類型,其中Key具有set的特點。
1.2 List
List java中有ArrayList和LinkedList兩種實現。
-
ArrayList
通過數組來實現,擅長讀操作,有容量概念,擴容發展50%。
-
LinkedList
內部通過鏈表實現,通過指針實現,檢索的對象時從兩頭檢索,看索引位於哪個半段范圍中。內部存放了首尾兩個節點,元素通過node連接在一起。Node由item 、 prev、 next構成,檢索最壞情況不會超過半數。
-
性能評測
Arraylist LinedList 結論 寫(100w) 90,255ms 40ms 200x 讀(5wth) 0.036,538ms 0.637,157ms 20x
1.3 Map
map是通過key-value關聯起來的映射構成的集合。其中key具有set的特點。java中Map有HashMap和TreeMap。
-
HashMap
-
內部通過數組+鏈表實現
class HashMap{ // transient Node<K,V>[] table; // static class Node<K,V> implements Map.Entry<K,V> { final int hash; final K key; V value; Node<K,V> next; } }
-
Hashmap put流程為
int newhash = 獲取key的新hash; 通過新hash定位桶的坐標; if(坐標位為空?){ 在該位置創建節點 ; } else{ if(新hash相同?){ if(key是同一對象?){ key相同,覆蓋value的值。 } else{ if(key的equals是否相同?){ key相同,覆蓋value } else{ 繼續尋找下一個Node; } } } else{ 繼續找下一個Node; } }
-
新hash計算方法
舊hash碼的高低16位做異或運算,實現計算結果的更加分散,高位右移是想讓更多的特征值參與進來。
static final int hash(Object key) { int h; return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16); }
-
-
TreeMap
內部通過紅黑二叉樹實現,具體見我的數據結構一文。
作業
-
設計一個類Person含有height、weight、age和blood是整數屬性,實現hashcode方法,將四個屬性編排到一個整數中作為hashcode.
答:
class Person{ private int height ; private int weight ; private int age ; private int blood ; public int hashCode(){ return (height & 0xff) << 24 | (weight & 0xff) << 16 | (age & 0xff) << 8 | (blood & 0xff) << 0 ; } public boolean equals(Object o){ if(o == null || o.getClass() != Person.class) return false ; return this.hashCode() == o.hashCode() ; } }
-
折半查找的時間復雜度問題
折半查找的時間復雜度為\(O(log_{2}n)\),具體過程見時間復雜度一文。
-
99乘法表的時間復雜度
99乘法表的時間復雜度為\(O(n^2)\) ,具體過程見時間復雜度一文。
-
兩個n階方陣的乘積的時間復雜度
兩個n階方陣的乘積的時間復雜度為\(O(n^3)\) ,具體過程見時間復雜度一文。
-
紅黑樹依次存放1,2,3,4,5,6,7,8做為key,給出樹的最終結構。
樹結構為: