一、List Set 區(qū)別
我們提供的服務(wù)有:網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、濮陽(yáng)縣ssl等。為千余家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的濮陽(yáng)縣網(wǎng)站制作公司
List 有序,可重復(fù);
Set 無(wú)序,不重復(fù);
二、List Set 實(shí)現(xiàn)類間區(qū)別及原理
Arraylist 底層實(shí)現(xiàn)使用Object[],數(shù)組查詢效率高
擴(kuò)容機(jī)制
讀取速度快,寫入會(huì)涉及到擴(kuò)容,所以相對(duì)較慢。
LinkedList底層采用雙向鏈表,只記錄 first 和 last(LinkedList.Node);
Node記錄 E item; Node
寫入速度快,但是讀取速度相對(duì)較慢;
HashSet 無(wú)序,不重復(fù)。
去重原理:所有值保存至HashMap的key中,利用HashMap的鍵不重復(fù)原理達(dá)到去重效果;
ArrayList去重可采用:new ArrayList(new HastSet(list));
TreeSet 有序,不重復(fù)。
底層采用TreeMap;
三、Map 實(shí)現(xiàn)原理及實(shí)現(xiàn)類對(duì)比
1. HashMap 線程不安全,無(wú)序
1) 內(nèi)部保存以數(shù)組 HashMap.Entry
static class Entryimplements Map.entry { final K key; V value; Entry next; int hash; Entry(int h, K k, V v, Entry n) { value = v; next = n; key = k; hash = h; } }
2) 線程不安全原因:
a 在數(shù)據(jù)操作方法上未采用synchronized同步標(biāo)識(shí),當(dāng)多線程發(fā)生hash碰撞時(shí),針對(duì)hash相等的key只會(huì)有一個(gè)能成功;
b 如果上面情況涉及到resize擴(kuò)容情況,每個(gè)線程內(nèi)都會(huì)對(duì)內(nèi)部數(shù)組進(jìn)行重新創(chuàng)建,但只有一個(gè)會(huì)成功;
3) 擴(kuò)容(默認(rèn)大小為16,2的四次方):
capacity = (capacity * 2 * loadFactor)
loadFactor:系數(shù)因子,默認(rèn)為0.75,時(shí)間與空間的權(quán)衡結(jié)果
4) 可通過(guò)LinkedHashMap達(dá)到有序效果;
2. Hashtable 內(nèi)部原理及使用幾乎等于HashMap,不同的是 所有操作數(shù)據(jù)方法都進(jìn)行了 synchronized 修飾,即同步處理,線程安全,但這導(dǎo)致單線程訪問(wèn)情況下效率要低于HashMap;
JDK4將Hashtable實(shí)現(xiàn)了Map接口,在JDK5中創(chuàng)建了替代類:ConcurrentHashMap(同步的HashMap)
HashMap想要同步可以采用 java.util.Collections.synchronizeMap(hashMap)(jdk2出現(xiàn));
同理:
Collections.synchronizeCollection(Collection
Collections.synchronizeList(List
Collections.synchronizeSet(Set
Collections.synchronizeSortedMap(SortedMap
Collections.synchronizeSortedSet(SortedSet
迭代HashMap采用快速失敗機(jī)制,而hashTable不是;
注:快速失敗模式指設(shè)計(jì)用來(lái)即時(shí)報(bào)告可能會(huì)導(dǎo)致失敗的任何故障情況,通常會(huì)用來(lái)停止正常的操作而不是嘗試?yán)^續(xù)做可能有缺陷的工作。與iterator有關(guān),如一個(gè)iterator在集合對(duì)象上創(chuàng)建了,其他線程欲“結(jié)構(gòu)化”的修改此集合對(duì)象,會(huì)拋出修改異常(ConcurrentModificationException)
3. 建議優(yōu)先考慮使用HashMap
以上所述是小編給大家介紹的Java集合基礎(chǔ)知識(shí) List/Set/Map詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)創(chuàng)新互聯(lián)網(wǎng)站的支持!