Java List接口詳解
繼承關(guān)系
List接口繼承自Collection接口,是Java集合框架中的有序集合。
Collection ← List
List接口新增方法
相比Collection接口,List增加了以下主要方法:
- 位置訪問(wèn)操作
E get(int index)E set(int index, E element)void add(int index, E element)E remove(int index)
- 搜索操作
int indexOf(Object o)int lastIndexOf(Object o)
- 列表迭代器
ListIterator<E> listIterator()ListIterator<E> listIterator(int index)
- 范圍操作
List<E> subList(int fromIndex, int toIndex)
List主要實(shí)現(xiàn)類
-
ArrayList
- 基于動(dòng)態(tài)數(shù)組實(shí)現(xiàn)
- 隨機(jī)訪問(wèn)快,插入刪除慢
- 非線程安全
-
LinkedList
- 基于雙向鏈表實(shí)現(xiàn)
- 插入刪除快,隨機(jī)訪問(wèn)慢
- 實(shí)現(xiàn)了Deque接口
-
Vector
- 線程安全的動(dòng)態(tài)數(shù)組
- 方法同步,性能較低
- 有子類Stack
-
CopyOnWriteArrayList
- 線程安全變體
- 寫(xiě)時(shí)復(fù)制機(jī)制
- 適合讀多寫(xiě)少場(chǎng)景
實(shí)踐中遇到的問(wèn)題及解決方案
問(wèn)題:ArrayList在并發(fā)環(huán)境下修改會(huì)拋出ConcurrentModificationException
解決方案:使用Collections.synchronizedList包裝或改用CopyOnWriteArrayList問(wèn)題:LinkedList的隨機(jī)訪問(wèn)性能差
解決方案:對(duì)于需要頻繁隨機(jī)訪問(wèn)的場(chǎng)景,改用ArrayList
面試常見(jiàn)問(wèn)題
Q: ArrayList和LinkedList的區(qū)別?
A: 主要區(qū)別在于底層實(shí)現(xiàn)(數(shù)組vs鏈表)和性能特點(diǎn)(隨機(jī)訪問(wèn)快vs插入刪除快)Q: Vector為什么被棄用?
A: 雖然線程安全但性能差,推薦使用Collections.synchronizedList或CopyOnWriteArrayList替代Q: List的subList方法使用時(shí)要注意什么?
A: subList是原列表的視圖,對(duì)子列表的修改會(huì)影響原列表,且原列表結(jié)構(gòu)變化會(huì)導(dǎo)致子列表操作拋出異常