您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“java集合中list的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“java集合中list的示例分析”這篇文章吧。
1、List接口
該接口定義的元素是有序的且可重復的。相當于數學里面的數列,有序可重復
booleanaddAll(intindex,Collection<?extendsE>c);將指定集合中所有元素,插入至本集合第index個元素之后defaultvoidreplaceAll(UnaryOperatoroperator);替換集合中每一個元素值defaultvoidsort(Comparator<?superE>c);給集合中的元素進行排序Eget(intindex);獲取集合中第index個元素Eset(intindex,Eelement);將集合中第index個元素替換成指定元素voidadd(intindex,Eelement);向集合中第index個位置添加一個元素Eremove(intindex);移除集合中第index個元素intindexOf(Objecto);得到指定元素在集合中的位置(第一次出現)intlastIndexOf(Objecto);得到指定元素在集合中的位置(最后一次出現)ListIteratorlistIterator();返回ListIteratorListIteratorlistIterator(intindex);返回ListIterator,并設置當前位置ListsubList(intfromIndex,inttoIndex);截取List,從fromIndex到toIndex
2、List子類
2.1、AbstractList抽象類
該類實現了基本的List集合功能,如果實現的是只讀的List集合,繼承自該抽象類的子類只需要實現get(intindex)和size()兩個方法,如果是可操作的List集合,則必須重寫add和set方法,否則執行add和set時會拋出UnsupportedOperationException異常
AbstractList抽象類中的迭代器通過get(intindex)訪問元素,通過remove(Objecto)刪除元素。
AbstractList抽象類包含了一個SubList子類,該子類通過包裝一個AbstractList抽象類對象實現元素的添加、刪除等功能。
該抽象類主要實現了如下方法:
booleanadd(Ee);添加元素e,內部調用add(intindex,Eelement)實現intindexOf(Objecto);得到指定元素第一次在集合中的位置,內部通過List迭代器實現intlastIndexOf(Objecto);得到指定元素在集合中的位置(最后一次出現),內部List迭代器實現,注意此處是從后往前迭代voidclear();清空List集合中的元素,內部通過List迭代器實現booleanaddAll(intindex,Collection<?extendsE>c);插入集合c中所有元素,內部調用add(intindex,Eelement)實現Iteratoriterator();返回一個迭代器對象,AbstractList抽象類內部實現了一個迭代器ListIteratorlistIterator();返回一個List迭代器對象,AbstractList抽象類內部實現了一個List迭代器booleanequals(Objecto);重寫Object的equals方法,內部先判斷是否同一個對象,是返回true,否則判斷o是否是List對象,不是返回false,是的話迭代比較兩個集合中每一個元素是否一致,都一致返回trueinthashCode();內部迭代集合中每一個元素計算出hashcode值ListsubList(intfromIndex,inttoIndex);得到List集合的子集合,內部通過構造AbstractList內部的SubList實現
2.2、ArrayList
ArrayList繼承自AbstractList實現了List中所有方法,該集合可以插入任何元素包括null元素。
ArrayList內部使用數組保存元素,他的size、isEmpty、get、set、add等操作都是常數時間。在獲取元素時會比LinkedList更有優勢。
Arraylist有一個初始的大小,該大小會隨著元素的增加而增長。
ArrayList不是線程安全的,在多線程環境下使用時需要注意,我們可以通過Collections.synchronizedList(newArrayList(…));操作得到一個線程安全的ArrayList
ArrayList中的迭代器在List集合結果變化后,我們調用迭代器中的方法時會快速拋出ConcurrentModificationException異常通知程序,以免造成損失。
ArrayList的擴展策略:
在初始集合為空時,加入元素時會初始化Math.max(DEFAULT_CAPACITY,minCapacity)個空間,即取插入元素個數和DEFAULT_CAPACITY中比較大的那個數
集合非空時插入元素,如果空間不夠時,則取原集合大小擴展2倍和最小需求大小中較大的那個進行擴展
ArrayList重寫了Iterator和ListIterator,內部直接通過遍歷數組實現
ArrayList重寫了SubList類,該類直接通過訪問數組實現
ArrayList主要包括以下屬性:
transientObject[]elementData;該對象數組用于存放集合中的元素intsize;該屬性用于保存集合的大小transientintmodCount;記錄ArrayList修改的次數,在集合迭代器中會使用該數字判斷迭代時集合是否修改過
ArrayList主要包含以下構造函數:ArrayList(intinitialCapacity);構造初始大小為initialCapacity的集合對象ArrayList();構造一個空的數組元素ArrayList(Collection<?extendsE>c);使用傳入集合c構造一個集合對象
ArrayList主要包括以下函數:
voidtrimToSize();將集合中數組大小恢復至當前集合大小,該操作可以壓縮集合使用空間voidensureCapacity(intminCapacity);通過傳入的minCapacity判斷集合是否需要擴展,需要的話則擴展數組大小,已足夠存放元素intindexOf(Objecto);得到指定元素第一次在集合中的位置,重寫了AbstractList類的方法,內部直接遍歷元素數組實現intlastIndexOf(Objecto);同上Objectclone();重寫了clone方法,并且將元素數組復制一份出來,且將modCount致0,注意此處數組中元素并沒有clone,也就是說克隆后的集合和元集合使用同一份具體元素Object[]toArray();直接返回本集合中的數組Eget(intindex);直接訪問數組Eset(intindex,Eelement);直接設置數組元素值booleanadd(Ee);直接操作數組,想數組添加一個元素Eremove(intindex);直接操作數組booleanremove(Objecto);一樣遍歷數組,注意該操作會導致數組移動voidclear();遍歷將數組致空,同時設置size大小為0booleanaddAll(Collection<?extendsE>c);通過數組直接添加voidsort(Comparator<?superE>c);實現集合中元素排序功能,接收一個Comparator用以比較集合中元素的大小
2.3、AbstractSequentialList抽象類
AbstractSequentialList是一個抽象類,繼承自AbstractList抽象類
AbstractSequentialList內部基于鏈表實現,主要針對順序訪問list集合的情況,它在隨機訪問時表現較差
AbstractSequentialList的實現者需要提供listIterator和size兩個實現,AbstractSequentialList內部本身通過listIterator實現了其他函數
ArrayList主要包含以下函數:
Eget(intindex);獲取第index個元素,內部通過ListIterator實現Eset(intindex,Eelement);替換集合的第index個元素,內部通過ListIterator實現voidadd(intindex,Eelement);想list集合中插入元素,內部通過voidadd(intindex,Eelement)實現Eremove(intindex);刪除list中第index個元素,內部通過ListIterator實現booleanaddAll(intindex,Collection<?extendsE>c);添加另一個集合中的所元素,內部通過ListIterator實現Iteratoriterator();直接調用listIterator()方法
2.4、LinkedList
LinkedList繼承自AbstractSequentialList抽象類,實現了List、Deque、Cloneable、和Serializable接口
LinkedList內部基于雙向鏈表實現,允許插入任何元素,包括null
LinkedList不是線程安全的,在多線程環境下使用時需要注意,我們可以通過Collections.synchronizedList(newLinledList(…));操作得到一個線程安全的ArrayList
LinkedList中的迭代器在List集合結果變化后,我們調用迭代器中的方法時會快速拋出ConcurrentModificationException異常通知程序,以免造成損失。
LinkedList內部使用Node類存儲元素,該類包含下面三個屬性,
Eitem;保存元素值得對象
Nodenext;下一個節點對象
Nodeprev;上一個節點對象
LinkedList重寫了ListIterator,內部直接通過遍歷鏈表實現迭代器功能
LinkedList主要包含以下屬性
transientintsize=0;集合當前大小transientNodefirst;鏈表的首元素transientNodelast;鏈表的尾元素
LinkedListList主要包含以下構造函數:LinkedList();空構造函數LinkedList(Collection<?extendsE>c);使用另外一個集合的構造函數,會將另一個集合所有元素加入本集合中
LinkedList主要包含以下函數:
自有函數
voidlinkFirst(Ee);插入元素至第一個位置voidlinkLast(Ee);插入元素至最后一個位置voidlinkBefore(Ee,Nodesucc);在某個元素之前插入一個元素EunlinkFirst(Nodef);移除第一個元素EunlinkLast(Nodel);移除最后一個元素Eunlink(Nodex);移除指定元素EgetFirst();得到第一個元素EgetLast();得到最后一個元素EremoveFirst();移除第一個元素EremoveLast();移除最后一個元素voidaddFirst(Ee);插入第一個元素voidaddLast(Ee);插入最后一個元素Nodenode(intindex);返回index對應的Node節點
List函數
booleancontains(Objecto);是否包含某個元素intsize();返回集合大小,直接返回size變量booleanadd(Ee);添加一個元素,調用linkLast(e);booleanremove(Objecto);刪除指定元素,通過遍歷鏈表刪除booleanaddAll(Collection<?extendsE>c);將集合c插入至本集合,鏈表插入voidclear();遍歷鏈表,清空所有元素,將首尾元素制空Eget(intindex);獲取第index個元素,通過node(index)得到node節點Eset(intindex,Eelement);替換第index個元素,通過node(index)得到node節點,然后設置值voidadd(intindex,Eelement);在第index位置插入元素,調用linkBefore(element,node(index));Eremove(intindex);刪除第index個元素,通過unlink(node(index));實現intindexOf(Objecto);得到o對象在集合中的位置(第一次出現),通過遍歷鏈表實現,從頭部開始遍歷intlastIndexOf(Objecto)得到o對象在集合中的位置(最后一次出現),通過遍歷鏈表實現,從尾部開始遍歷
Deque函數Epeek();返回第一個元素,但不刪除。直接去first首元素,集合空時,返回nullEelement();返回第一個元素,但不刪除。集合空時拋出異常,調用getFirst();Eremove();獲得并移除隊列頂部元素,如果隊列為空拋出異常,調用removeFirstEpoll();獲得并移除隊列頂部元素,如果隊列為空返回null調用unlinkFirst(f)booleanoffer(Ee);隊列尾部插入元素,調用add(e)booleanofferFirst(Ee);隊列首部插入元素,調用addFirst(e);booleanofferLast(Ee);隊列尾部插入元素,調用addLast(e)EpeekFirst();返回首元素EpeekLast();返回最后一個元素,不刪除,空時返回nullEpollFirst();獲得并移除隊列頂部元素,如果隊列為空返回null調用unlinkFirst(f)EpollLast();獲得并移除隊列尾部元素,如果隊列為空返回null調用unlinkLast(f)voidpush(Ee);向首部插入元素,調用addFirst(e);,棧方法Epop();返回并移除首元素,調用removeFirst();,棧方法booleanremoveFirstOccurrence(Objecto);刪除第一次出現o的元素,調用remove(o);函數booleanremoveLastOccurrence(Objecto);刪除最后一次出現o的元素,從后向前遍歷鏈表,匹配后移除
2.5、Vector
功能和ArrayList類似,不同的是Vector是線程安全的,其大部分方法都加了synchronized關鍵字以保證多線程環境下線程安全問題。不過在可以確保沒有線程安全問題的情況下,我們還是應該選擇ArrayList,因為ArrayList的效率要比Vector高。
2.6、CopyOnWriteArrayList
CopyOnWriteArrayList繼承Object,實現了List,RandomAccess,Cloneable,java.io.Serializable接口
CopyOnWriteArrayList是
CopyOnWriteArrayList內部使用數組保存元素,但是它的數組大小等于集合的大小,因為它的增加、刪除、修改元素都是新copy一份數組
CopyOnWriteArrayList是線程安全的,他的寫操作加鎖,讀操作沒有加鎖,適用于讀多寫少的情況
CopyOnWriteArrayList實現了Iterator和ListIterator,內部通過遍歷數組實現,但是它的迭代器不支持操作元素。會拋出UnsupportedOperationException
CopyOnWriteArrayList主要包含以下屬性:
finaltransientReentrantLocklock;CopyOnWriteArrayList內部使用的線程同步鎖transientvolatileObject[]array;集合內部用于保存元素的地方
CopyOnWriteArrayList主要包含以下構造函數:
CopyOnWriteArrayList();構造一個空的集合CopyOnWriteArrayList(Collection<?extendsE>c);創建一個包括闖入集合所有元素的集合CopyOnWriteArrayList(E[]toCopyIn);創建一個包含傳入數組所有元素的集合,注:此處會copy原有數組。
CopyOnWriteArrayList主要包括以下函數:
finalObject[]getArray();得到集合持有的數組對象voidsetArray(Object[]a);設置集合的數組對象intsize();返回集合大小,直接返回數組的長度booleanisEmpty();判斷集合是否為空booleancontains(Objecto);判斷集合是否包含某元素intindexOf(Objecto);得到傳入元素在集合中第一次出現的位置索引intindexOf(Ee,intindex);得到傳入元素在集合中第一次出現的位置索引,從index開始查找intlastIndexOf(Objecto);得到傳入元素在集合中最后一次出現的位置索引,從集合尾部開始查找lastIndexOf(Ee,intindex);得到傳入元素在集合中出現的位置索引,從集合index開始往前查找Objectclone();返回集合的clone,集合的元素沒有被cloneObject[]toArray();轉換成數組,此處返回的是數組的copyT[]toArray(Ta[]);轉換成數組,如果傳入數組小于當前集合,重新申請一塊空間,否則使用數組a,當數組a大于集合長度時將數組a的臨近集合元素的第一個元素設置成null,可以方便用戶在知道集合不含null元素時判斷集合的大小Eget(intindex);獲取集合的index索引元素Eset(intindex,Eelement);設置集合的index元素的值booleanadd(Ee);往集合中添加元素voidadd(intindex,Eelement);插入元素至指定位置Eremove(intindex);移除指定位置的元素booleanremove(Objecto);移除第一次出現元素ovoidremoveRange(intfromIndex,inttoIndex);移除范圍內的所有元素booleanaddIfAbsent(Ee);當集合中不包含該元素時,添加該元素booleanaddIfAbsent(Ee,Object[]snapshot);當集合中不包含該元素且傳入數組中也不包含該元素時,添加該元素booleancontainsAll(Collection<?>c);判斷集合是否全部包含傳入集合的元素booleanremoveAll(Collection<?>c);移除集合中c中所有元素booleanretainAll(Collection<?>c);移除集合中所有不在c中的元素intaddAllAbsent(Collection<?extendsE>c);遍歷c,當c中元素不在集合中時,加入至集合voidclear();清空集合booleanaddAll(Collection<?extendsE>c);將集合c中所有元素加入至集合中booleanaddAll(intindex,Collection<?extendsE>c);將集合c中所有元素插入至index后
2.7、Stack
Stack繼承自Vector,他表示一種后進先出的數據結構,即棧。他擁有五種基本的操作即push、pop、peek、empty、search
Stack繼承自Vector,所以它也是線程安全的
Stack繼承自Vector,所以它內部也是用數組存儲元素的
Stack自定義函數如下
Epush(Eitem);向棧頂添加一個元素Epop();從棧頂取出并刪除一個元素Epeek();得到棧頂元素booleanempty();判斷棧是否為空intsearch(Objecto);查找o的位置,存在返回距棧頂位置,否則返回-1
以上是“java集合中list的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。