摘要:舉個栗子,常見的如迭代器用于遍歷容器,源碼如下常見用法存放獨(dú)立元素的序列。數(shù)據(jù)結(jié)構(gòu)使用的是散列表,是最常用的是與同理,用于排序。所以當(dāng)有其它線程改變了的結(jié)構(gòu)增加或者移除元素,將會拋出,但迭代器本身的方法移除元素則不會拋出異常。
一圖勝千言
其中用綠色填充的為常用的類,需重點(diǎn)掌握。
Java容器的最上層都是以接口的形式出現(xiàn),具體實(shí)現(xiàn)由子接口完成。舉個栗子,常見的如
MapIteratormap = new HashMap ();
迭代器,用于遍歷容器,JDK源碼如下:
package java.util; import java.util.function.Consumer; public interface Iterator{ boolean hasNext(); E next(); default void remove() { throw new UnsupportedOperationException("remove"); } default void forEachRemaining(Consumer super E> action) { Objects.requireNonNull(action); while (hasNext()) action.accept(next()); } }
常見用法:
Iterator iter = l.iterator(); while(iter.hasNext()){ String str = (String) iter.next(); System.out.println(str); }Collection
存放獨(dú)立元素的序列。Collection下又有三個子接口,List,Set,Queue。
一個有序的Collection(也稱序列),元素可以重復(fù)。確切的講,列表通常允許滿足 e1.equals(e2) 的元素對 e1 和 e2,并且如果列表本身允許 null 元素的話,通常它們允許多個 null 元素。實(shí)現(xiàn)List的有:ArrayList、LinkedList、Vector、Stack等。
一個不包括重復(fù)元素(包括可變對象)的Collection,是一種無序的集合。Set不包含滿 a.equals(b) 的元素對a和b,并且最多有一個null。實(shí)現(xiàn)Set的接口有:EnumSet、HashSet、TreeSet等。
一種隊(duì)列則是雙端隊(duì)列,支持在頭、尾兩端插入和移除元素,主要包括:ArrayDeque、LinkedBlockingDeque、LinkedList。另一種是阻塞式隊(duì)列,隊(duì)列滿了以后再插入元素則會拋出異常,主要包括ArrayBlockQueue、PriorityBlockingQueue、LinkedBlockingQueue。
Map存放key-value型的元素對。
常見容器與工具類 ArrayList數(shù)據(jù)結(jié)構(gòu)采用的是線性表,優(yōu)勢是訪問和查詢十分方便,但添加和刪除的時候效率很低。
LinkedList數(shù)據(jù)結(jié)構(gòu)采用的是鏈表,優(yōu)勢是刪除和添加的效率很高,但隨機(jī)訪問元素時效率較ArrayList類低。
HashSet數(shù)據(jù)結(jié)構(gòu)采用的是散列表,主要是設(shè)計(jì)用來做高性能集運(yùn)算的,例如對兩個集合求交集、并集、差集等。集合中包含一組不重復(fù)出現(xiàn)且無特性順序的元素。其值是不可重復(fù)與無序的。
TreeSet數(shù)據(jù)結(jié)構(gòu)使用的是紅黑樹,性能上低于HashSet,用于排序。
HashMap數(shù)據(jù)結(jié)構(gòu)使用的是散列表,是最常用的是Collection
TreeMap與TreeSet同理,用于排序。
Arrays、Collections這兩者可以理解成工具類,提供一些處理容器類靜態(tài)方法,比如二分查找,排序等等。
常見的容器比較 ArrayList VS VectorArrayList在內(nèi)存不夠時默認(rèn)是擴(kuò)展50% + 1個,Vector是默認(rèn)擴(kuò)展1倍。
Vector提供indexOf(obj, start)接口,ArrayList沒有。
Vector屬于線程安全級別的,但是大多數(shù)情況下不使用Vector,因?yàn)榫€程安全需要更大的系統(tǒng)開銷。
沒特殊需求,一般用ArrayList
ArrayList VS LinkedList因?yàn)锳rray是基于索引(index)的數(shù)據(jù)結(jié)構(gòu),它使用索引在數(shù)組中搜索和讀取數(shù)據(jù)是很快的。Array獲取數(shù)據(jù)的時間復(fù)雜度是O(1),但是要刪除數(shù)據(jù)卻是開銷很大的,因?yàn)檫@需要重排數(shù)組中的所有數(shù)據(jù)。
相對于ArrayList,LinkedList插入是更快的。因?yàn)長inkedList不像ArrayList一樣,不需要改變數(shù)組的大小,也不需要在數(shù)組裝滿的時候要將所有的數(shù)據(jù)重新裝入一個新的數(shù)組,這是ArrayList最壞的一種情況,時間復(fù)雜度是O(n),而LinkedList中插入或刪除的時間復(fù)雜度僅為O(1)。ArrayList在插入數(shù)據(jù)時還需要更新索引(除了插入數(shù)組的尾部)。
類似于插入數(shù)據(jù),刪除數(shù)據(jù)時,LinkedList也優(yōu)于ArrayList。
LinkedList需要更多的內(nèi)存,因?yàn)锳rrayList的每個索引的位置是實(shí)際的數(shù)據(jù),而LinkedList中的每個節(jié)點(diǎn)中存儲的是實(shí)際的數(shù)據(jù)和前后節(jié)點(diǎn)的位置。
HashTable VS HashMapHashMap幾乎可以等價(jià)于Hashtable,除了HashMap是非synchronized的,并可以接受null(HashMap可以接受為null的鍵值(key)和值(value),而Hashtable則不行)。
HashMap是非synchronized,而Hashtable是synchronized,這意味著Hashtable是線程安全的,多個線程可以共享一個Hashtable;而如果沒有正確的同步的話,多個線程是不能共享HashMap的。Java 5提供了ConcurrentHashMap,它是HashTable的替代,比HashTable的擴(kuò)展性更好。
另一個區(qū)別是HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以當(dāng)有其它線程改變了HashMap的結(jié)構(gòu)(增加或者移除元素),將會拋出ConcurrentModificationException,但迭代器本身的remove()方法移除元素則不會拋出ConcurrentModificationException異常。但這并不是一個一定發(fā)生的行為,要看JVM。這條同樣也是Enumeration和Iterator的區(qū)別。
由于Hashtable是線程安全的也是synchronized,所以在單線程環(huán)境下它比HashMap要慢。如果你不需要同步,只需要單一線程,那么使用HashMap性能要好過Hashtable。
HashMap不能保證隨著時間的推移Map中的元素次序是不變的。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/64381.html
摘要:我的是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)。因?yàn)槲倚睦砗芮宄?,我的目?biāo)是阿里。所以在收到阿里之后的那晚,我重新規(guī)劃了接下來的學(xué)習(xí)計(jì)劃,將我的短期目標(biāo)更新成拿下阿里轉(zhuǎn)正。 我的2017是忙碌的一年,從年初備戰(zhàn)實(shí)習(xí)春招,年三十都在死磕JDK源碼,三月份經(jīng)歷了阿里五次面試,四月順利收到實(shí)習(xí)offer。然后五月懷著忐忑的心情開始了螞蟻金...
摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統(tǒng)一配置,便于修改。 前言 只有光頭才能變強(qiáng) 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 工廠模式理解了沒有? 在刷Spring書籍的時候花了點(diǎn)時間去學(xué)習(xí)了單例模式和工廠模式,總的來說還是非常值得的! 本來想的是刷完《Spring 實(shí)戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應(yīng)用開發(fā)實(shí)戰(zhàn)》...
摘要:原文地址游客前言金三銀四,很多同學(xué)心里大概都準(zhǔn)備著年后找工作或者跳槽。最近有很多同學(xué)都在交流群里求大廠面試題。 最近整理了一波面試題,包括安卓JAVA方面的,目前大廠還是以安卓源碼,算法,以及數(shù)據(jù)結(jié)構(gòu)為主,有一些中小型公司也會問到混合開發(fā)的知識,至于我為什么傾向于混合開發(fā),我的一句話就是走上編程之路,將來你要學(xué)不僅僅是這些,豐富自己方能與世接軌,做好全棧的裝備。 原文地址:游客kutd...
摘要:而調(diào)用后端服務(wù)就應(yīng)用了的高級特分布式配置管理平臺后端掘金輕量的分布式配置管理平臺。關(guān)于網(wǎng)絡(luò)深度解讀后端掘金什么是網(wǎng)絡(luò)呢總的來說,網(wǎng)絡(luò)中的容器們可以相互通信,網(wǎng)絡(luò)外的又訪問不了這些容器。 在 Java 路上,我看過的一些書、源碼和框架(持續(xù)更新) - 后端 - 掘金簡書 占小狼轉(zhuǎn)載請注明原創(chuàng)出處,謝謝!如果讀完覺得有收獲的話,歡迎點(diǎn)贊加關(guān)注 物有本末,事有終始,知所先后,則近道矣 ......
閱讀 2638·2021-11-18 10:02
閱讀 2289·2021-09-30 09:47
閱讀 1808·2021-09-27 14:01
閱讀 3120·2021-08-16 11:00
閱讀 3173·2019-08-30 11:06
閱讀 2403·2019-08-29 17:29
閱讀 1543·2019-08-29 13:19
閱讀 453·2019-08-26 13:54