亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

JAVA 常用集合內部機制原理

瀏覽:49日期:2022-09-05 14:48:17

對于常用的集合大家都不陌生,但是深入到內部原理可能都是一知半解,通過閱讀源碼理解如下。

ArrayList

ArrayList內部就是一個默認大小為10的動態(tài)對象數組容器,每當add一個新數據的時候,如果大于原來的容器大小,則會通過Arrays.copyOf把容器大小增加到原來的1.5倍,以此類推。當可以預知數據大小,可以通過initialCapacity來默認設置動態(tài)數據的大小,減少擴容帶來的資源消耗。

時間復雜度:

get() - 直接讀取下標 - O(1)

add(E) - 直接在后面添加 - O(1)

add(idnex, E) - 插入數據后需要移動后面的數據 - O(n)

remove(index) - 刪除后需要移動 - O(n)

LinkedList

LinkedList內部是一個雙向鏈表,add新數據的時候,其實就是調用linklast在鏈表尾部插入數據。刪除的時候直接找到對應數據,替換掉鏈表的前后節(jié)點即可。

時間復雜度:

get() - 需要遍歷 - O(n)

add(E) - 調用linklast直接添加在最后 - O(1)

add(index, E) - 需要先查找到原來index位置的數據,再重新指定鏈表前后的數據 - O(n)

remove() - 直接調用removeLast刪除最后數據 - O(1)

remove(index) - 需要先查找到原來index位置的數據 - O(n)

HashMap

HashMap內部其實是一個數組,每個數組下是一個單向鏈表。HashMap中的數組是一個取名為Entry的類,類包含(key, value, next)這幾個屬性。存放規(guī)則為,數組下標按hash(key)%len獲得,取得數組后則查找對應數組的值。HashMap還有個負載因子(默認0.75),當里面數組填滿了75%的時候,會進行擴展到原來大小的2倍。

那么問題來了,如果在put的時候,取到hash(key)%len的值相等時不就沖突了?HashMap的處理方法是:原來有一個Entry[0] = A,此時來一個index也是0的B,則會把Entry[0] = B,B.next = A,又來一個C的時候,則會把Entry[0] = C,C.next = B,以此類推。這樣Entry就會形成一個鏈表,取的時候則是遍歷鏈表取值。

這里需要提到的是,使用hashMap的時候,引入的key對象必須重寫hashCode()和equal()兩個函數,原因可以參考源碼判斷條件(if (e.hash == hash && ((k = e.key) == key || key.equals(k)))),如果hashCode()沒重寫,則壓根找不到對應數組,如果equal()沒重寫,則無法判斷key值的內容是否相等。

public V put(K key, V value) { if (key == null) return putForNullKey(value); //null總是放在數組的第一個鏈表中 int hash = hash(key.hashCode()); int i = indexFor(hash, table.length); //遍歷鏈表 for (Entry<K,V> e = table[i]; e != null; e = e.next) { Object k; //如果key在鏈表中已存在,則替換為新value if (e.hash == hash && ((k = e.key) == key || key.equals(k))){ V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }

補充:

在java8之后hashmap進行了優(yōu)化:由于單向鏈表的查詢時間復雜度為O(n),在極端情況下可能存在性能問題,于是java8針對鏈表長度大于8的情況會使用時間復雜度為O(log n)的紅黑樹進行存儲來提升存儲查詢的效率。

LinkedHashMap

LinkedHashMap內部雙向鏈表和HashMap的結合,支持多種迭代順序,默認按插入順序,也可以按訪問順序。

訪問順序(accessOrder=true):調用過get訪問的元素會放到鏈尾,迭代會從鏈首開始

插入順序(accessOrder=false):按插入順序迭代出來

TreeMap

TreeMap內部是基于紅黑樹實現(xiàn)的,并且默認會通過compareTo按照key類型進行自然排序。TreeSet的低層是TreeMap。

來自:http://www.jointforce.com/jfperiodical/article/4192

標簽: Java
相關文章:
主站蜘蛛池模板: 免费一级片视频 | 365深夜福利在线观看 | 国产亚洲欧美在在线人成 | 一级国产黄色片 | 一级v片| 国产日韩欧美在线一二三四 | 华人欧美国产在线精品 | 亚洲精品国产精品一区二区 | 高清在线一区 | 香蕉视频免费看 | 久久综合九色综合欧美播 | 久久久美女 | 久草中文在线视频 | 婷婷久久综合网 | 一区二区三区欧美在线 | 欧美成人性毛片免费版 | 国产在线视频色综合 | 色综合久久久久久久 | 久草在线成人 | 屁屁影院一区二区三区 | 一区二区三区网站在线免费线观看 | 午夜成年人网站 | 大陆一级毛片免费视频观看 | 欧美一级aa免费毛片 | 午夜一级视频 | 在线精品国产成人综合第一页 | 国产剧情毛片 | 国产精品永久在线 | 一级做a爰片久久毛片唾 | 国内精品久久久久久西瓜色吧 | 美国一级黄色毛片 | 欧美一级特黄aaaaaa在线看片 | 午夜在线播放免费人成无 | 久久我们这里只有精品国产4 | 黄网在线观看网址入口 | 欧美精品午夜毛片免费看 | 亚洲国产欧美一区 | 国产精品久久久久一区二区三区 | 男女免费高清在线爱做视频 | 手机看片日韩 | 亚洲精品国产一区二区在线 |