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