面試官:小伙子辐宾,你連Java集合都講不清楚狱从,怎么就敢開口要8K呀?

Java架構(gòu)進階資料叠纹,面試視頻解析矫夯,可點此處獲取。

開始之前吊洼,先給大家講個小故事吧:

image

不是這個~

面試官:你好训貌!請簡單介紹一下你自己

騷年:大佬您好!我在讀書的時候就十分仰慕您,您一直都是我的偶像递沪,所以我職高剛畢業(yè)就迫不及待的學Java技術(shù)豺鼻,然后來您所在的公司應聘,沒想到面試官就是您

面試官:等等款慨,職...職高儒飒?

騷年:這都不重要,噢~我親愛的大佬檩奠,您知道嗎桩了?我非常敬仰您,也羨慕您埠戳,羨慕您頭頂一毛不拔的那塊地井誉,那是我一直向往的地方...

面試官(摸了摸從右邊蓋到左邊的頭發(fā)):咳咳...,咱回歸正題整胃,額~這個颗圣,剛找工作?

騷年:不完全是屁使,學習期間實習過一段時間

面試官:嗯在岂,先問問,對薪資有什么期望嗎蛮寂?

騷年:額~我來算算蔽午,我一個月房租1200,一天抽兩包6塊錢的煙酬蹋,中飯加晚飯一天20及老,還要喝飲料,用電除嘹、用水啥的写半,算下來8000塊岸蜗,這樣尉咕,我就不賺錢了,就8K璃岳!

面試官:就8K年缎?我們這邊最低都是28K,那行铃慷,了解一下你的技術(shù)水平吧单芜,問:前段時間微博服務(wù)器崩潰,是怎么回事犁柜?

騷年:爸摒?

面試官:額~拿錯了臺本,再來扒腕,說說Java集合绢淀!

騷年:這個我知道,List和Set

面試官:還有呢瘾腰?

騷年:還有嗎皆的?沒有了吧?

面試官:小伙子蹋盆,你Java集合都說不全费薄,怎么敢要8K啊栖雾?回家吧楞抡!

騷年:......

細說Java集合

image

點擊此處,獲取免費領(lǐng)取Java核心知識點高清完整大圖岩灭、PDF資料拌倍、技術(shù)視頻

接口繼承關(guān)系和實現(xiàn)

集合類存放于 Java.util 包中,主要有 3 種:set(集)噪径、list(列表包含 Queue)和 map(映射)柱恤。

1. Collection:Collection 是集合 List、Set找爱、Queue 的最基本的接口

2. Iterator:迭代器梗顺,可以通過迭代器遍歷集合中的數(shù)據(jù)

3. Map:是映射表的基礎(chǔ)接口

image
image

List

image

Java 的 List 是非常常用的數(shù)據(jù)類型。List 是有序的 Collection车摄。Java List 一共三個實現(xiàn)類:分別是 ArrayList寺谤、Vector 和 LinkedList。

image

1吮播、ArrayList(數(shù)組)

ArrayList 是最常用的 List 實現(xiàn)類变屁,內(nèi)部是通過數(shù)組實現(xiàn)的,它允許對元素進行快速隨機訪問意狠。數(shù)組的缺點是每個元素之間不能有間隔粟关,當數(shù)組大小不滿足時需要增加存儲能力,就要將已經(jīng)有數(shù)組的數(shù)據(jù)復制到新的存儲空間中环戈。當從 ArrayList 的中間位置插入或者刪除元素時闷板,需要對數(shù)組進行復制、移動院塞、代價比較高遮晚。因此,它適合隨機查找和遍歷拦止,不適合插入和刪除县遣。

2、Vector(數(shù)組實現(xiàn)、線程同步)

Vector 與 ArrayList 一樣萧求,也是通過數(shù)組實現(xiàn)的括蝠,不同的是它支持線程的同步,即某一時刻只有一個線程能夠?qū)?Vector饭聚,避免多線程同時寫而引起的不一致性忌警,但實現(xiàn)同步需要很高的花費,因此秒梳,訪問它比訪問 ArrayList 慢法绵。

3、LinkList(鏈表)

LinkedList 是用鏈表結(jié)構(gòu)存儲數(shù)據(jù)的酪碘,很適合數(shù)據(jù)的動態(tài)插入和刪除朋譬,隨機訪問和遍歷速度比較慢。另外兴垦,他還提供了 List 接口中沒有定義的方法徙赢,專門用于操作表頭和表尾元素,可以當作堆棧探越、隊列和雙向隊列使用狡赐。

Set

image

Set 注重獨一無二的性質(zhì),該體系集合用于存儲無序(存入和取出的順序不一定相同)元素,值不能重復钦幔。對象的相等性本質(zhì)是對象 hashCode 值(java 是依據(jù)對象的內(nèi)存地址計算出的此序號)判斷的枕屉,如果想要讓兩個不同的對象視為相等的,就必須覆蓋 Object 的 hashCode 方法和 equals 方法鲤氢。

image

1搀擂、HashSet(Hash 表)

哈希表邊存放的是哈希值。HashSet 存儲元素的順序并不是按照存入時的順序(和 List 顯然不同) 而是按照哈希值來存的所以取數(shù)據(jù)也是按照哈希值取得卷玉。元素的哈希值是通過元素的hashcode 方法來獲取的, HashSet 首先判斷兩個元素的哈希值哨颂,如果哈希值一樣,接著會比較equals 方法 如果 equls 結(jié)果為 true 相种,HashSet 就視為同一個元素威恼。如果 equals 為 false 就不是同一個元素。

哈希值相同 equals 為 false 的元素是怎么存儲呢,就是在同樣的哈希值下順延(可以認為哈希值相同的元素放在一個哈希桶中)蚂子。也就是哈希一樣的存一列沃测。如圖 1 表示 hashCode 值不相同的情況缭黔;圖 2 表示 hashCode 值相同食茎,但 equals 不相同的情況。

image

HashSet 通過 hashCode 值來確定元素在內(nèi)存中的位置馏谨。一個 hashCode 位置上可以存放多個元素别渔。

2、TreeSet(二叉樹)

  1. TreeSet()是使用二叉樹的原理對新 add()的對象按照指定的順序排序(升序、降序)哎媚,每增加一個對象都會進行排序喇伯,將對象插入的二叉樹指定的位置。

  2. Integer 和 String 對象都可以進行默認的 TreeSet 排序拨与,而自定義類的對象是不可以的稻据,自己定義的類必須實現(xiàn) Comparable 接口,并且覆寫相應的 compareTo()函數(shù)买喧,才可以正常使用捻悯。

  3. 在覆寫 compare()函數(shù)時,要返回相應的值才能使 TreeSet 按照一定的規(guī)則來排序淤毛。

  4. 比較此對象與指定對象的順序今缚。如果該對象小于、等于或大于指定對象低淡,則分別返回負整數(shù)姓言、零或正整數(shù)。

3蔗蹋、LinkHashSet(HashSet+LinkedHashMap)

對于 LinkedHashSet 而言何荚,它繼承與 HashSet、又基于 LinkedHashMap 來實現(xiàn)的猪杭。LinkedHashSet 底層使用 LinkedHashMap 來保存所有元素兽泣,它繼承與 HashSet,其所有的方法操作上又與 HashSet 相同胁孙,因此 LinkedHashSet 的實現(xiàn)上非常簡單唠倦,只提供了四個構(gòu)造方法,并通過傳遞一個標識參數(shù)涮较,調(diào)用父類的構(gòu)造器稠鼻,底層構(gòu)造一個 LinkedHashMap 來實現(xiàn),在相關(guān)操作上與父類 HashSet 的操作相同狂票,直接調(diào)用父類 HashSet 的方法即可候齿。

Map

image
image

1、HashMap(數(shù)組+鏈表+紅黑樹)

HashMap 根據(jù)鍵的 hashCode 值存儲數(shù)據(jù)闺属,大多數(shù)情況下可以直接定位到它的值慌盯,因而具有很快的訪問速度,但遍歷順序卻是不確定的掂器。HashMap 最多只允許一條記錄的鍵為 null亚皂,允許多條記錄的值為 null。HashMap 非線程安全国瓮,即任一時刻可以有多個線程同時寫 HashMap灭必,可能會導致數(shù)據(jù)的不一致狞谱。如果需要滿足線程安全,可以用 Collections 的 synchronizedMap 方法使HashMap 具有線程安全的能力禁漓,或者使用 ConcurrentHashMap跟衅。我們用下面這張圖來介紹HashMap 的結(jié)構(gòu)。

(1)JAVA7 實現(xiàn)

image

大方向上播歼,HashMap 里面是一個數(shù)組伶跷,然后數(shù)組中每個元素是一個單向鏈表。上圖中秘狞,每個綠色的實體是嵌套類 Entry 的實例撩穿,Entry 包含四個屬性:key, value, hash 值和用于單向鏈表的 next。

  1. capacity:當前數(shù)組容量谒撼,始終保持 2^n食寡,可以擴容,擴容后數(shù)組大小為當前的 2 倍廓潜。

  2. loadFactor:負載因子抵皱,默認為 0.75。

  3. threshold:擴容的閾值辩蛋,等于 capacity * loadFactor呻畸。

(2)JAVA8 實現(xiàn)

Java8 對 HashMap 進行了一些修改,最大的不同就是利用了紅黑樹悼院,所以其由數(shù)組+鏈表+紅黑樹組成伤为。

根據(jù) Java7 HashMap 的介紹,我們知道据途,查找的時候绞愚,根據(jù) hash 值我們能夠快速定位到數(shù)組的具體下標,但是之后的話颖医,需要順著鏈表一個個比較下去才能找到我們需要的位衩,時間復雜度取決于鏈表的長度,為 O(n)熔萧。為了降低這部分的開銷糖驴,在 Java8 中,當鏈表中的元素超過了 8 個以后佛致,會將鏈表轉(zhuǎn)換為紅黑樹贮缕,在這些位置進行查找的時候可以降低時間復雜度為O(logN)。

image

2俺榆、ConcurrentHashMap

(1)Segment 段

ConcurrentHashMap 和 HashMap 思路是差不多的感昼,但是因為它支持并發(fā)操作,所以要復雜一些肋演。整個 ConcurrentHashMap 由一個個 Segment 組成抑诸,Segment 代表”部分“或”一段“的意思,所以很多地方都會將其描述為分段鎖爹殊。注意蜕乡,行文中,我很多地方用了“槽”來代表一個segment梗夸。

(2)線程安全(Segment 繼承 ReentrantLock 加鎖)

簡單理解就是层玲,ConcurrentHashMap 是一個 Segment 數(shù)組,Segment 通過繼承ReentrantLock 來進行加鎖反症,所以每次需要加鎖的操作鎖住的是一個 segment辛块,這樣只要保證每個 Segment 是線程安全的,也就實現(xiàn)了全局的線程安全铅碍。

image

(3)并行度(默認 16)

concurrencyLevel:并行級別润绵、并發(fā)數(shù)、Segment 數(shù)胞谈,怎么翻譯不重要尘盼,理解它。默認是16烦绳,也就是說 ConcurrentHashMap 有 16 個 Segments卿捎,所以理論上,這個時候径密,最多可以同時支持 16 個線程并發(fā)寫午阵,只要它們的操作分別分布在不同的 Segment 上。這個值可以在初始化的時候設(shè)置為其他值享扔,但是一旦初始化以后底桂,它是不可以擴容的。再具體到每個 Segment 內(nèi)部惧眠,其實每個 Segment 很像之前介紹的 HashMap戚啥,不過它要保證線程安全,所以處理起來要麻煩些锉试。

(4)Java8 實現(xiàn) (引入了紅黑樹)

Java8 對 ConcurrentHashMap 進行了比較大的改動,Java8 也引入了紅黑樹猫十。

image

3、HashTable(線程安全)

Hashtable 是遺留類呆盖,很多映射的常用功能與 HashMap 類似拖云,不同的是它承自Dictionary類,并且是線程安全的应又,任一時間只有一個線程能寫 Hashtable宙项,并發(fā)性不如ConcurrentHashMap,因為ConcurrentHashMap 引入了分段鎖株扛。Hashtable 不建議在新代碼中使用尤筐,不需要線程安全的場合可以用 HashMap 替換汇荐,需要線程安全的場合可以用ConcurrentHashMap 替換。

4盆繁、TreeMap(可排序)

TreeMap 實現(xiàn) SortedMap 接口掀淘,能夠把它保存的記錄根據(jù)鍵排序,默認是按鍵值的升序排序油昂,也可以指定排序的比較器革娄,當用 Iterator 遍歷 TreeMap 時,得到的記錄是排過序的冕碟。如果使用排序的映射拦惋,建議使用 TreeMap。在使用 TreeMap 時安寺,key 必須實現(xiàn) Comparable 接口或者在構(gòu)造 TreeMap 傳入自定義的Comparator冗恨,否則會在運行時拋出java.lang.ClassCastException 類型的異常增显。

5时鸵、LinkHashMap(記錄插入順序)

LinkedHashMap 是 HashMap 的一個子類斋日,保存了記錄的插入順序,在用 Iterator 編LinkedHashMap 時挠羔,先得到的記錄肯定是先插入的井仰,也可以在構(gòu)造時帶參數(shù),按照訪問次序排序破加。

Java架構(gòu)進階資料俱恶,面試視頻解析,可點此處獲取范舀。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末合是,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子锭环,更是在濱河造成了極大的恐慌聪全,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件辅辩,死亡現(xiàn)場離奇詭異难礼,居然都是意外死亡,警方通過查閱死者的電腦和手機玫锋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評論 2 382
  • 文/潘曉璐 我一進店門蛾茉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人撩鹿,你說我怎么就攤上這事谦炬。” “怎么了?”我有些...
    開封第一講書人閱讀 152,762評論 0 342
  • 文/不壞的土叔 我叫張陵键思,是天一觀的道長础爬。 經(jīng)常有香客問我,道長吼鳞,這世上最難降的妖魔是什么看蚜? 我笑而不...
    開封第一講書人閱讀 55,273評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮赖条,結(jié)果婚禮上失乾,老公的妹妹穿的比我還像新娘常熙。我一直安慰自己纬乍,他們只是感情好,可當我...
    茶點故事閱讀 64,289評論 5 373
  • 文/花漫 我一把揭開白布裸卫。 她就那樣靜靜地躺著仿贬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪墓贿。 梳的紋絲不亂的頭發(fā)上茧泪,一...
    開封第一講書人閱讀 49,046評論 1 285
  • 那天,我揣著相機與錄音聋袋,去河邊找鬼队伟。 笑死,一個胖子當著我的面吹牛幽勒,可吹牛的內(nèi)容都是我干的嗜侮。 我是一名探鬼主播,決...
    沈念sama閱讀 38,351評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼啥容,長吁一口氣:“原來是場噩夢啊……” “哼锈颗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起咪惠,我...
    開封第一講書人閱讀 36,988評論 0 259
  • 序言:老撾萬榮一對情侶失蹤击吱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后遥昧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體覆醇,經(jīng)...
    沈念sama閱讀 43,476評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,948評論 2 324
  • 正文 我和宋清朗相戀三年炭臭,在試婚紗的時候發(fā)現(xiàn)自己被綠了叫乌。 大學時的朋友給我發(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
  • 我被黑心中介騙來泰國打工彼哼, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留对妄,地道東北人。 一個月前我還...
    沈念sama閱讀 45,511評論 2 354
  • 正文 我出身青樓敢朱,卻偏偏與公主長得像剪菱,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蔫饰,可洞房花燭夜當晚...
    茶點故事閱讀 42,802評論 2 345