貴陽(yáng)網(wǎng)站設(shè)計(jì)免費(fèi)做網(wǎng)站的平臺(tái)
ArrayList<>()
import java.util.ArrayList; // 引入 ArrayList 類ArrayList<E> objectName =new ArrayList<>(); // 初始化
常用方法
方法 | 描述 |
---|---|
add() | 將元素插入到指定位置的 arraylist 中 |
addAll() | 添加集合中的所有元素到 arraylist 中 |
clear() | 刪除 arraylist 中的所有元素 |
clone() | 復(fù)制一份 arraylist |
contains() | 判斷元素是否在 arraylist |
get() | 通過(guò)索引值獲取 arraylist 中的元素 |
indexOf() | 返回 arraylist 中元素的索引值 |
removeAll() | 刪除存在于指定集合中的 arraylist 里的所有元素 |
remove() | 刪除 arraylist 里的單個(gè)元素 |
size() | 返回 arraylist 里元素?cái)?shù)量 |
isEmpty() | 判斷 arraylist 是否為空 |
subList() | 截取部分 arraylist 的元素 |
set() | 替換 arraylist 中指定索引的元素 |
sort() | 對(duì) arraylist 元素進(jìn)行排序 |
toArray() | 將 arraylist 轉(zhuǎn)換為數(shù)組 |
toString() | 將 arraylist 轉(zhuǎn)換為字符串 |
ensureCapacity() | 設(shè)置指定容量大小的 arraylist |
lastIndexOf() | 返回指定元素在 arraylist 中最后一次出現(xiàn)的位置 |
retainAll() | 保留 arraylist 中在指定集合中也存在的那些元素 |
containsAll() | 查看 arraylist 是否包含指定集合中的所有元素 |
trimToSize() | 將 arraylist 中的容量調(diào)整為數(shù)組中的元素個(gè)數(shù) |
removeRange() | 刪除 arraylist 中指定索引之間存在的元素 |
replaceAll() | 將給定的操作內(nèi)容替換掉數(shù)組中每一個(gè)元素 |
removeIf() | 刪除所有滿足特定條件的 arraylist 元素 |
forEach() | 遍歷 arraylist 中每一個(gè)元素并執(zhí)行特定操作 |
LinkedList<>()
LinkedList 繼承了 AbstractSequentialList 類。
LinkedList 實(shí)現(xiàn)了 Queue 接口,可作為隊(duì)列使用。
LinkedList 實(shí)現(xiàn)了 List 接口,可進(jìn)行列表的相關(guān)操作。
LinkedList 實(shí)現(xiàn)了 Deque 接口,可作為隊(duì)列使用。
LinkedList 實(shí)現(xiàn)了 Cloneable 接口,可實(shí)現(xiàn)克隆。
LinkedList 實(shí)現(xiàn)了 java.io.Serializable 接口,即可支持序列化,能通過(guò)序列化去傳輸。
// 引入 LinkedList 類
import java.util.LinkedList; LinkedList<E> list = new LinkedList<E>(); // 普通創(chuàng)建方法LinkedList<E> list = new LinkedList(Collection<? extends E> c); // 使用集合創(chuàng)建鏈表
更多的情況下我們使用 ArrayList 訪問(wèn)列表中的隨機(jī)元素更加高效,但以下幾種情況 LinkedList 提供了更高效的方法。
- 在列表開頭添加元素:addFirst( #value?)
- 在列表結(jié)尾添加元素:addLast( #value?)
- 在列表開頭移除元素:removeFirst()
- 在列表結(jié)尾移除元素:removeLast()
- 獲取列表開頭的元素:getFirst()
- 獲取列表結(jié)尾的元素:getLast()
- 迭代元素:使用for配合size()來(lái)迭代
常用方法
方法 | 描述 |
---|---|
public boolean add(E e) | 鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。 |
public void add(int index, E element) | 向指定位置插入元素。 |
public boolean addAll(Collection?c) | 將一個(gè)集合的所有元素添加到鏈表后面,返回是否成功,成功為 true,失敗為 false。 |
public boolean addAll(int index, Collection?c) | 將一個(gè)集合的所有元素添加到鏈表的指定位置后面,返回是否成功,成功為 true,失敗為 false。 |
public void addFirst(E e) | 元素添加到頭部。 |
public void addLast(E e) | 元素添加到尾部。 |
public boolean offer(E e) | 向鏈表末尾添加元素,返回是否成功,成功為 true,失敗為 false。 |
public boolean offerFirst(E e) | 頭部插入元素,返回是否成功,成功為 true,失敗為 false。 |
public boolean offerLast(E e) | 尾部插入元素,返回是否成功,成功為 true,失敗為 false。 |
public void clear() | 清空鏈表。 |
public E removeFirst() | 刪除并返回第一個(gè)元素。 |
public E removeLast() | 刪除并返回最后一個(gè)元素。 |
public boolean remove(Object o) | 刪除某一元素,返回是否成功,成功為 true,失敗為 false。 |
public E remove(int index) | 刪除指定位置的元素。 |
public E poll() | 刪除并返回第一個(gè)元素。 |
public E remove() | 刪除并返回第一個(gè)元素。 |
public boolean contains(Object o) | 判斷是否含有某一元素。 |
public E get(int index) | 返回指定位置的元素。 |
public E getFirst() | 返回第一個(gè)元素。 |
public E getLast() | 返回最后一個(gè)元素。 |
public int indexOf(Object o) | 查找指定元素從前往后第一次出現(xiàn)的索引。 |
public int lastIndexOf(Object o) | 查找指定元素最后一次出現(xiàn)的索引。 |
public E peek() | 返回第一個(gè)元素。 |
public E element() | 返回第一個(gè)元素。 |
public E peekFirst() | 返回頭部元素。 |
public E peekLast() | 返回尾部元素。 |
public E set(int index, E element) | 設(shè)置指定位置的元素。 |
public Object clone() | 克隆該列表。 |
public Iterator?descendingIterator() | 返回倒序迭代器。 |
public int size() | 返回鏈表元素個(gè)數(shù)。 |
public ListIterator?listIterator(int index) | 返回從指定位置開始到末尾的迭代器。 |
public Object[] toArray() | 返回一個(gè)由鏈表元素組成的數(shù)組。 |
public?T[] toArray(T[] a) | 返回一個(gè)由鏈表元素轉(zhuǎn)換類型而成的數(shù)組。 |
一、ArrayList和LinkedList的區(qū)別
Java LinkedList(鏈表) 類似于 ArrayList,是一種常用的數(shù)據(jù)容器。
與 ArrayList 相比,LinkedList 的增加和刪除的操作效率更高,而查找和修改的操作效率較低。
以下情況使用 ArrayList :
- 頻繁訪問(wèn)列表中的某一個(gè)元素。
- 只需要在列表末尾進(jìn)行添加和刪除元素操作。
以下情況使用 LinkedList :
- 你需要通過(guò)循環(huán)迭代來(lái)訪問(wèn)列表中的某些元素。
- 需要頻繁的在列表開頭、中間、末尾等位置進(jìn)行添加和刪除元素操作。
線程安全:
- 二者都不保證線程安全
底層數(shù)據(jù)結(jié)構(gòu):
- ArrayList底層使用Object[]數(shù)組
- LinkedList底層使用的是雙向鏈表數(shù)據(jù)結(jié)構(gòu),jdk1.6之前為雙向循環(huán)鏈表,jdk1.7之前為取消了循環(huán)
插入和刪除是否受元素位置影響:
- ArrayList采用數(shù)組存儲(chǔ),所以插入和刪除元素的時(shí)間復(fù)雜度受元素位置的影響
- LinkedList采用鏈表進(jìn)行存儲(chǔ)
是否支持快速隨機(jī)訪問(wèn):
- 快速隨機(jī)訪問(wèn)就是通過(guò)元素的序號(hào)快速獲取元素對(duì)象
- RandomAccess接口
內(nèi)存空間占用:
- ArravList的空間浪費(fèi)主要休現(xiàn)在list列表的結(jié)尾會(huì)預(yù)留一定的容量空間
- Linkedlist的空間花費(fèi)則體現(xiàn)在它的每個(gè)元 茶都需要消耗比ArrayList更多的空間,用于存放直接后繼和直接前馭以及數(shù)據(jù)
二、ArrayList和Vector的區(qū)別
? ? ? ? ArrayList是List的古老實(shí)現(xiàn)類,底層使用Object[]存儲(chǔ)的,線程不安全
? ? ? ? Vector是List的古老實(shí)現(xiàn)類,底層也是用Obejct[]存儲(chǔ)的,線程安全
三、CopyOnWriteArrayList
- 線程安全。
- add()方法實(shí)現(xiàn):在add()的時(shí)候會(huì)加上Lock鎖,然后復(fù)制出一個(gè)新的數(shù)組,往新的數(shù)組里面add真正的元素,最后把a(bǔ)rray的指向改變?yōu)樾碌臄?shù)組。
- get()方法或者是size()方法只是獲取array所指向的元素或者大小,讀不加鎖,但是寫加鎖。
- 很耗費(fèi)內(nèi)存,每次set(),add()都會(huì)復(fù)制一個(gè)數(shù)組出來(lái)。
- 只能保證數(shù)據(jù)的最終一致性,不能保證數(shù)據(jù)的實(shí)時(shí)一致性。 // 假設(shè)有兩個(gè)線程,A去讀CopyOnWriteArravList的數(shù)據(jù)還沒(méi)讀完,如果現(xiàn)在線程B把這個(gè)list給清空了,線程A此時(shí)還是可以把剩余的數(shù)據(jù)給讀出來(lái)。