面試系列之java集合

1.java集合接口

集合類在java.util包下遭顶,主要有Set张峰、List和Map
Collection:Collection 是集合 List、Set棒旗、Queue 的最基本的接口喘批。
Iterator:迭代器,可以通過迭代器遍歷集合中的數(shù)據(jù)
Map:是映射表的基礎(chǔ)接口


java集合類

java集合框架

2.List

List是非常常用的集合,它里面的元素是可重復(fù)且有序的饶深,主要有三個實現(xiàn)類分別是:ArrayList餐曹、Vector、LinkedList敌厘。

3.ArrayList

數(shù)據(jù)結(jié)構(gòu):底層是用數(shù)組實現(xiàn)的台猴,利用數(shù)組連續(xù)下標(biāo)的特性可以快速讀取對應(yīng)的元素
擴(kuò)容機(jī)制:當(dāng)容量不足需要擴(kuò)容時,通過復(fù)制元素到新的數(shù)組额湘。
線程安全:否
特點:查詢快卿吐,利用數(shù)據(jù)的連續(xù)下標(biāo)特點,增刪慢锋华,因為增刪后需要對數(shù)組進(jìn)行復(fù)制嗡官,移動。所以適合查多寫少的場景毯焕。

4.Vector

Vector和ArrayList一樣底層都是數(shù)組實現(xiàn)的衍腥,不同的是Vector是線程安全的。也就是說同一時刻只能由一個線程對Vector進(jìn)行寫纳猫,避免了多線程操作的數(shù)據(jù)安全問題婆咸,同時由于加鎖的操作也使得性能低于ArrayList。

5.LinkedList

數(shù)據(jù)結(jié)構(gòu):雙向鏈表結(jié)構(gòu)芜辕,增刪比較快只要修改前后指針的指向尚骄,讀取由于沒有下標(biāo)需要遍歷讀
擴(kuò)容機(jī)制:自動擴(kuò)容
線程安全:否
特點:適合動態(tài)的增刪,隨機(jī)讀取速度比較慢侵续,另外還提供了操作頭尾元素的方法倔丈,很適合做堆棧,隊列或雙向隊列状蜗。

6.Set

Set主要是側(cè)重元素的唯一性需五,且無序的,存入和讀取不一定一樣轧坎。保證唯一性主要是通過hashCode來保證宏邮,java對象的hashCode是通過內(nèi)存地址來計算的哈希值。如果想讓兩個不同的對象視為相等就要重寫Object的hashCode方法和equals方法缸血。

7.HashSet

HashSet數(shù)據(jù)的存儲和讀取是根據(jù)哈希值來計算的蜜氨,是無序的。HashSet會先判斷hashCode方法是否一樣属百,如果不一樣就是不同對象记劝,如果一樣還要繼續(xù)判斷equals方法的返回結(jié)果,true就認(rèn)為是同一個對象族扰,false就是不同對象。但是他們的存儲是有所不同的。
hashCode不同:


哈希值不同

hashCode一樣渔呵,equals返回false:


哈希值相等

也就是說一個哈希值的位置上可以存放多個元素怒竿,只不過他們形成一個鏈表或者說放到一個哈希桶中。

8.TreeSet

TreeSet是以二叉樹結(jié)構(gòu)來存放扩氢,每新增一個對象都會按升序或降序存放到二叉樹指定位置耕驰。
但是升序降序要實現(xiàn)Comparable接口重新compareTo()方法,Integer和String可以進(jìn)行默認(rèn)排序。

9.LinkedHashSet

LinkedHashSet實際上就是集成了HashSet录豺,結(jié)構(gòu)又是用LinkedHashMap來存儲朦肘,說白了就是只用到Map的key部分。所以LinkedHashSet的方法和HashSet幾乎一樣双饥,只是提供了幾個構(gòu)造函數(shù)媒抠,構(gòu)造函數(shù)調(diào)用父構(gòu)造函數(shù)初始化LinkedHashMap來做數(shù)據(jù)存儲。

10.HashMap

Map是存放鍵值對數(shù)據(jù)咏花,HashMap的key不允許重復(fù)趴生,允許為null,但是只有一個null昏翰,value可以重復(fù)也可以為null苍匆。正常情況下通過哈希值都能快速讀取到元素,但是遍歷的順序是不一定的棚菊。HashMap是非線程安全的浸踩。hashMap有幾個比較重要的屬性1. capacity:當(dāng)前數(shù)組容量,始終保持 2^n统求,可以擴(kuò)容检碗,擴(kuò)容后數(shù)組大小為當(dāng)前的 2 倍。2. loadFactor:負(fù)載因子球订,默認(rèn)為 0.75后裸。3. threshold:擴(kuò)容的閾值,等于 capacity * loadFactor冒滩。
不同版本的jdk微驶,hashMap的結(jié)構(gòu)有所區(qū)別
jdk1.7版本主要是哈希+鏈表的結(jié)構(gòu)


1.7hashMap結(jié)構(gòu)

大體上看是一個數(shù)組結(jié)構(gòu)當(dāng)哈希值沖突的時候在對應(yīng)位置演變成一個鏈表結(jié)構(gòu),鏈表結(jié)構(gòu)存的是Entry對象包括key开睡,value因苹,哈希值和next信息。
jdk1.8版本主要是哈希+鏈表+紅黑樹的結(jié)構(gòu)


1.8hashMap結(jié)構(gòu)

jdk1.8對hashMap的結(jié)構(gòu)進(jìn)行了優(yōu)化篇恒,1.7中哈希沖突的的時候在對應(yīng)位置上演變鏈表位置扶檐,那查找的時候鏈表上的元素的時候時間復(fù)雜度就是O(n)头镊,取決于鏈表的長度空另。1.8中在鏈表的長度超過8的時候?qū)㈡湵硌葑兂杉t黑樹,自然查找的效率就高很多咕娄。

11.ConcurrentHashMap

ConcurrentHashMap和HashMap的結(jié)構(gòu)差不多,但是呢它是線程安全的奈梳,所以為了解決這個線程安全又想效率維持在較高的水平杈湾,就多了分段的概念。整個ConcurrentHashMap是有一個個分段Segment組成攘须,Segment通過繼承ReentrantLock來進(jìn)行對該分段進(jìn)行加鎖漆撞,該分段里的數(shù)據(jù)結(jié)構(gòu)跟HashMap幾乎一樣。


ConcurrentHashMap

在jdk1.8中鏈表超過8也是演變成紅黑樹于宙。
ConcurrentHashMap 有 16 個 Segments浮驳,所以理論上,這個時候捞魁,最多可以同時支
持 16 個線程并發(fā)寫至会,只要它們的操作分別分布在不同的 Segment 上。這個值可以在初始化的時
候設(shè)置為其他值署驻,但是一旦初始化以后奋献,它是不可以擴(kuò)容的。

12.HashTable

HashTable現(xiàn)在幾乎不使用了旺上,他的功能和HashMap一樣瓶蚂,是線程安全的,但是加鎖的粒度比較大性能不是很高宣吱,如果想要線程安全就用ConcurrentHashMap窃这,不在乎線程安全的場景就用HashMap。

13.TreeMap

TreeMap實現(xiàn)了SortedMap接口征候,支持根據(jù)key進(jìn)行排序杭攻,默認(rèn)是按鍵值的升序排序,也可以指定排序的比較器疤坝,在使用 TreeMap 時兆解,key 必須實現(xiàn) Comparable 接口或者在構(gòu)造 TreeMap 傳入自定義的
Comparator,否則會在運行時拋出 java.lang.ClassCastException 類型的異常跑揉。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锅睛,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子历谍,更是在濱河造成了極大的恐慌现拒,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件望侈,死亡現(xiàn)場離奇詭異印蔬,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)脱衙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進(jìn)店門侥猬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來例驹,“玉大人,你說我怎么就攤上這事陵究∶咭” “怎么了奥帘?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵铜邮,是天一觀的道長。 經(jīng)常有香客問我寨蹋,道長松蒜,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任已旧,我火速辦了婚禮秸苗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘运褪。我一直安慰自己惊楼,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布秸讹。 她就那樣靜靜地躺著檀咙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪璃诀。 梳的紋絲不亂的頭發(fā)上弧可,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機(jī)與錄音劣欢,去河邊找鬼棕诵。 笑死,一個胖子當(dāng)著我的面吹牛凿将,可吹牛的內(nèi)容都是我干的校套。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼牧抵,長吁一口氣:“原來是場噩夢啊……” “哼笛匙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起灭忠,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤膳算,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后弛作,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涕蜂,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年映琳,在試婚紗的時候發(fā)現(xiàn)自己被綠了机隙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蜘拉。...
    茶點故事閱讀 38,064評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖有鹿,靈堂內(nèi)的尸體忽然破棺而出旭旭,到底是詐尸還是另有隱情,我是刑警寧澤葱跋,帶...
    沈念sama閱讀 33,712評論 4 323
  • 正文 年R本政府宣布持寄,位于F島的核電站,受9級特大地震影響娱俺,放射性物質(zhì)發(fā)生泄漏稍味。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,261評論 3 307
  • 文/蒙蒙 一荠卷、第九天 我趴在偏房一處隱蔽的房頂上張望模庐。 院中可真熱鬧,春花似錦油宜、人聲如沸掂碱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽疼燥。三九已至,卻和暖如春粪薛,著一層夾襖步出監(jiān)牢的瞬間悴了,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評論 1 262
  • 我被黑心中介騙來泰國打工违寿, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留湃交,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓藤巢,卻偏偏與公主長得像搞莺,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子掂咒,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,802評論 2 345

推薦閱讀更多精彩內(nèi)容