上篇文章我們介紹了ArrayList類(lèi)的基本的使用及其內(nèi)部的一些方法的實(shí)現(xiàn)原理,但是這種集合類(lèi)型雖然可以隨機(jī)訪(fǎng)問(wèn)數(shù)據(jù),但是如果需要?jiǎng)h除中間的元素就需要移動(dòng)一半的元素的位置,效率低下。并且它內(nèi)部是用數(shù)組來(lái)實(shí)現(xiàn)的,數(shù)組要求連續(xù)的存儲(chǔ)空間,當(dāng)數(shù)據(jù)量大的時(shí)候就極耗內(nèi)存。本篇我們介紹使用鏈表實(shí)現(xiàn)的集合LinkedList,這種類(lèi)型不需要連續(xù)的存儲(chǔ)空間,刪除數(shù)據(jù)方便,但是不支持隨機(jī)訪(fǎng)問(wèn)并且查找效率低下,幾乎是ArrayList的對(duì)立面。我們將從以下方面介紹此類(lèi)型:
超接口和超類(lèi)的基本方法及實(shí)現(xiàn)
內(nèi)部組成細(xì)節(jié)
add方法的源碼解析
remove方法的源碼解析
低效的get方法
LinkedList的應(yīng)用場(chǎng)景
一、了解LinkedList的超接口
我們首先看到LinkedList實(shí)現(xiàn)了接口Deque,而這個(gè)接口又實(shí)現(xiàn)了Queue接口,那我們就從Queue接口看起。
public interface Queue<E> extends Collection<E> { boolean add(E e);//添加元素
boolean offer(E e);//添加元素
E remove();//刪除元素
E poll();//刪除元素
E element();//返回頭部元素
E peek();//返回頭部元素}
我們可以看到該接口中聲明的每個(gè)操作都是由兩個(gè)方法對(duì)應(yīng),那這兩個(gè)方法之間有什么不同呢?調(diào)用兩種方法的任意一種都是可以完成我們所需要的大部分功能,但是當(dāng)處于特殊情況下,兩者處理方式不一樣。比如:當(dāng)鏈表為空時(shí),調(diào)用remove就會(huì)拋異常,而poll則是返回特殊值null,當(dāng)鏈表滿(mǎn)了,調(diào)用add就會(huì)拋異常,而offer就會(huì)false。(我們的LinkedList 是沒(méi)有長(zhǎng)度限制的,但是對(duì)于其他實(shí)現(xiàn)Queue的類(lèi)可能會(huì)有長(zhǎng)度限制,及可能會(huì)滿(mǎn)員)。
看完了Queue我們看看看他的子接口Deque(雙端隊(duì)列):
延伸閱讀
學(xué)習(xí)是年輕人改變自己的最好方式