#集合
? ? Java集合類存放于 java.util 包中,是一個(gè)用來存放對(duì)象(引用類型)的容器(存儲(chǔ)基本類型會(huì)被自動(dòng)裝箱,轉(zhuǎn)化陳包裝類)
? ? ①、集合只能存放對(duì)象。比如你存一個(gè) int 型數(shù)據(jù) 1放入集合中,其實(shí)它是自動(dòng)轉(zhuǎn)換成 Integer 類后存入的,Java中每一種基本類型都有對(duì)應(yīng)的引用類型。
? ? ②、集合存放的是多個(gè)對(duì)象的引用,對(duì)象本身還是放在堆內(nèi)存中。
? ? ③、集合可以存放不同類型,不限數(shù)量的數(shù)據(jù)類型。
##1、集合的各體系結(jié)構(gòu)
? ? Java 的集合 主要由兩個(gè)接口派生出來的,分別是Collection和Map。
### 1.1 collection 集合? ?
? ? collection 主要派生了3個(gè)子類,分別為List(列表)、Set(集)、Queue(隊(duì)列)。其中,List、Queue中的元素有序可重復(fù),而Set中的元素?zé)o序不可重復(fù);
####1.1.1 List 集合
? list 集合是有序的、可重復(fù)的。主要有兩個(gè)實(shí)現(xiàn)類ArrayList和LinkedList。
#####1.1.1.2 ArryList
? ? 1)? ArryList 底層是基于動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)的,且線程不安全。
? ? 2) 實(shí)現(xiàn)了序列化接口java.io.Serializable,支持序列化。
? ? 3) 實(shí)現(xiàn)了Cloneable接口,它允許在堆中克隆出一塊和原對(duì)象一樣的對(duì)象,并將這個(gè)對(duì)象的地址賦予新的引用,這樣顯然對(duì)新引用的操作,不會(huì)影響到原對(duì)象。
? ? ArrayList 是如何擴(kuò)容的?
#####1.1.1.3 LinkedList? ? ? ?
? ? ? LinkedList 底層是基于雙向鏈表實(shí)現(xiàn)的。且線程不安全
#####1.1.1.4 Vector? ? ?
? ? ? 和ArrayList實(shí)現(xiàn)方式相同, 但考慮了線程安全問題, 所以效率略低。
#### 1.1.2 queue
####1.1.3 set
##? 1. ArrayList 和 LinkedList 的區(qū)別、優(yōu)缺點(diǎn)以及應(yīng)用場景?
? ? ArrayList 和 LinkedList 都是不同步的,也就是不保證線程安全;
>1)底層實(shí)現(xiàn)區(qū)別:
? ? ArryList 底層是基于動(dòng)態(tài)數(shù)據(jù)實(shí)現(xiàn)的,而LinkedList是基于雙向鏈表實(shí)現(xiàn)的。
>2)優(yōu)缺點(diǎn):
? ? 由于ArrayList底層由動(dòng)態(tài)數(shù)組實(shí)現(xiàn)的,而數(shù)組是按照順序且連續(xù)的存儲(chǔ)數(shù)據(jù)。所以一般情況下查詢的速度會(huì)比LinkedList快,但是插入或者刪除數(shù)據(jù)的速度較LinkedList慢,因?yàn)閿?shù)組的結(jié)構(gòu)是連續(xù)的,每一次插入或刪除數(shù)據(jù)就需要變更整個(gè)數(shù)組中的數(shù)據(jù)的位置(末尾插入和刪除除外)。
>3)應(yīng)用場景
? ? 應(yīng)用場景由他們的特點(diǎn)決定的。ArryList適用與查詢多的場景,而LinkedList適用與增刪的場景。
? ? 知識(shí)擴(kuò)展
? ? 1) 鏈表是物理存儲(chǔ)結(jié)構(gòu)上非連續(xù)的、非順序的存儲(chǔ)結(jié)構(gòu)數(shù)據(jù)元素的邏輯順序是通過鏈表中的指針鏈接次序?qū)崿F(xiàn)的。
? ? 2) 鏈表的結(jié)構(gòu):鏈表是由很多節(jié)點(diǎn)構(gòu)成的,每個(gè)節(jié)點(diǎn)又包含兩部分,即數(shù)據(jù)和指針,數(shù)據(jù)存儲(chǔ)實(shí)際的數(shù)據(jù),指針保存下一個(gè)節(jié)點(diǎn)的位置。