List接口概述
- 鑒于Java中數(shù)組用來存儲(chǔ)數(shù)據(jù)的局限性蛀恩,我們通常使用List替代數(shù)組
- List集合類中元素有序领迈、且可重復(fù)算吩,集合中的每個(gè)元素都有其對(duì)應(yīng)的順序索引拓萌。
- List容器中的元素都對(duì)應(yīng)一個(gè)整數(shù)型的序號(hào)記載其在容器中的位置岁钓,可以根據(jù)序號(hào)存取容器中的元素。
- JDK API中List接口的實(shí)現(xiàn)類常用的有:ArrayList微王、LinkedList和Vector屡限。
List接口方法
- 增:
void add(int index, Object ele):在index位置插入ele元素。
boolean addAll(int index, Collection eles):從index位置開始將eles中的所有元素添加進(jìn)來炕倘。 - 刪:
Object remove(int index):移除指定index位置的元素钧大,并返回此元素 - 改:
Object set(int index, Object ele):設(shè)置指定index位置的元素為ele
1.查:
Object get(int index):獲取指定index位置的元素
int indexOf(Object obj):返回obj在集合中首次出現(xiàn)的位置
int lastIndexOf(Object obj):返回obj在當(dāng)前集合中末次出現(xiàn)的位置
List subList(int fromIndex, int toIndex):返回從fromIndex到toIndex
位置的子集合
List實(shí)現(xiàn)類之一:ArrayList
本質(zhì)上,ArrayList是對(duì)象引用的一個(gè)”變長(zhǎng)”數(shù)組
ArrayList的JDK1.8之前與之后的實(shí)現(xiàn)區(qū)別罩旋?
- JDK1.7:ArrayList像餓漢式啊央,直接創(chuàng)建一個(gè)初始容量為10的數(shù)組
- JDK1.8:ArrayList像懶漢式,一開始創(chuàng)建一個(gè)長(zhǎng)度為0的數(shù)組涨醋,當(dāng)添加第一個(gè)元素時(shí)再創(chuàng)建一個(gè)始容量為10的數(shù)組
Arrays.asList() 方法返回的 List 集合瓜饥,既不是 ArrayList 實(shí)例,也不是Vector 實(shí)例浴骂。 Arrays.asList() 返回值是一個(gè)固定長(zhǎng)度的 List 集合
List實(shí)現(xiàn)類之二:LinkedList
LinkedList:雙向鏈表乓土,內(nèi)部沒有聲明數(shù)組,而是定義了Node類型的first和last溯警,用于記錄首末元素趣苏。同時(shí),定義內(nèi)部類Node梯轻,作為L(zhǎng)inkedList中保存數(shù)據(jù)的基本結(jié)構(gòu)食磕。Node除了保存數(shù)據(jù),還定義了兩個(gè)變量:
List 實(shí)現(xiàn)類之三:Vector
Vector 是一個(gè)古老的集合喳挑,JDK1.0就有了芬为。大多數(shù)操作與ArrayList相同,區(qū)別之處在于Vector是線程安全的蟀悦。
在各種list中媚朦,最好把ArrayList作為缺省選擇。當(dāng)插入日戈、刪除頻繁時(shí)询张,使用LinkedList;Vector總是比ArrayList慢浙炼,所以盡量避免使用份氧。
ArrayList/LinkedList/Vector的異同
ArrayList和LinkedList的異同:
二者都線程不安全唯袄,相對(duì)線程安全的Vector,執(zhí)行效率高蜗帜。
此外恋拷,ArrayList是實(shí)現(xiàn)了基于動(dòng)態(tài)數(shù)組的數(shù)據(jù)結(jié)構(gòu),LinkedList基于鏈表的數(shù)據(jù)結(jié)構(gòu)厅缺。對(duì)于隨機(jī)訪問get和set蔬顾,ArrayList覺得優(yōu)于LinkedList,因?yàn)長(zhǎng)inkedList要移動(dòng)指針湘捎。對(duì)于新增和刪除操作add(特指插入)和remove诀豁,LinkedList比較占優(yōu)勢(shì),因?yàn)锳rrayList要移動(dòng)數(shù)據(jù)窥妇。
ArrayList和Vector的異同:
Vector和ArrayList幾乎是完全相同的,唯一的區(qū)別在于Vector是同步類(synchronized)舷胜,屬于強(qiáng)同步類。因此開銷就比ArrayList要大活翩,訪問要慢烹骨。正常情況下,大多數(shù)的Java程序員使用ArrayList而不是Vector,因?yàn)橥酵耆梢杂沙绦騿T自己來控制。Vector每次擴(kuò)容請(qǐng)求其大小的2倍空間材泄,而ArrayList是1.5倍展氓。Vector還有一個(gè)子類Stack。