詳解JAVA中的Collection接口和其主要實(shí)現(xiàn)的類
Collection是最基本的集合接口,一個(gè)Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set,詳細(xì)信息可見官方文檔http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/Collection.html,下面我們來討論繼承它的接口list,Set,這兩個(gè)接口實(shí)現(xiàn)了主要的方法,但是還是有一些拓展的,不如list中的迭代就和collection中的有些不同,下面會(huì)詳細(xì)介紹,這里我們用一個(gè)例子體會(huì)一下這里的接口的實(shí)現(xiàn):
Collection<Integer> list=new LinkedList<>();
list
- list是有序的 collection(也稱為序列)。此接口的用戶可以對(duì)列表中每個(gè)元素的插入位置進(jìn)行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素。
- list與Set不同,list允許重復(fù)的元素插入
- list接口提供了兩種在列表的任意位置高效插入和移除多個(gè)元素的方法。
- 下面我們來具體介紹一下它的實(shí)現(xiàn)的類
LinkedList
從文檔中可以看到這個(gè)listedList實(shí)現(xiàn)的不只是list接口,比如還是實(shí)現(xiàn)了Deque接口,這個(gè)為 add、poll 提供先進(jìn)先出隊(duì)列操作,以及其他堆棧和雙端隊(duì)列操作。這里的LinkedList都是用雙向鏈表實(shí)現(xiàn)的,這個(gè)類不是同步的,因此在多個(gè)線程中有修改其中的元素操作時(shí)必須實(shí)現(xiàn)外部的線程同步
構(gòu)造方法
LinkedList()創(chuàng)建一個(gè)空的鏈表LinkedList(Collection<? extends E> c)構(gòu)造一個(gè)包含指定 collection 中的元素的列表,這些元素按其 collection 的迭代器返回的順序排列,構(gòu)造如下:
ArrayList<Integer> arrayList=new ArrayList<>(); //這里新建一個(gè)線性列表 LinkedList<Integer> linkedList=new LinkedList<Integer>(arrayList); //用線性列表新建一個(gè)鏈表 System.out.println(linkedList.getFirst());
方法摘要
boolean add(E e)將指定元素添加到此列表的結(jié)尾。成功插入返回Truevoid add(int index, E element)在此列表中指定的位置插入指定的元素。boolean addAll(Collection<? extends E> c)添加指定 collection 中的所有元素到此列表的結(jié)尾,順序是指定 collection 的迭代器返回這些元素的順序。例子如下:
ArrayList arrayList=new ArrayList();//新建一個(gè)線性表
arrayList.add(10);
arrayList.add(100);
arrayList.add(2);
LinkedList linkedList=new LinkedList();
linkedList.add(100);
linkedList.add("chenjiabing");
linkedList.addAll(arrayList); //將線性表中所有的元素添加到鏈表中
for(Object i:linkedList)
{
System.out.println(i);
}
boolean addAll(int index, Collection<? extends E> c)將指定 collection 中的所有元素從指定位置開始插入此列表。addFirst將指定的元素添加到開頭addLast將指定的元素添加到末尾clear()從列表中移除全部的元素clone()得到一個(gè)鏈表的副本,由于其返回的類型是Object,因此需要進(jìn)行強(qiáng)制轉(zhuǎn)換成LinkedList類型
LinkedList list=(LinkedList)linkedList.clone();
contains(Object o)如果此列表中包含元素o返回Trueelement()獲取但不移除此列表的頭(第一個(gè)元素)。iterator()返回列表中的元素的迭代器
Iterator iter=list.iterator(); //返回一個(gè)迭代器類型
while(iter.hasNext()) //判斷迭代器中是否存在元素
{
Object o=iter.next();
if(o.equals(1))
{
System.out.println(o); //輸出迭代器中的元素
iter.remove(); //移除這個(gè)元素,這個(gè)是從列表中直接移除的
}
}
- listIterator() 返回此列表中的元素的列表迭代器(按適當(dāng)順序),從列表中指定位置開始
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) //首先將迭代器一直運(yùn)行到末尾
{
Object o = iterator.next();
if (o.equals(1)) {
iterator.add(100); //將元素插入到當(dāng)前元素的前面,這個(gè)在Iterator是不存在的方法
}
}
while (iterator.hasPrevious()) //這時(shí)的迭代器是從末尾開始的,因此這里相當(dāng)與逆序輸出
{
System.out.println(iterator.previous());
}
get(int index) 返回此列表中指定位置處的元素。這里要注意的是雖然這種方式能夠得到指定索引的值,但是這里對(duì)于鏈表中的操作開銷是非常大的,因此這個(gè)方法不主張使用,如果需要遍歷列表可以使用迭代器和for-each語句
LinkedList list=new LinkedList();
for(int i=0;i<10;i++)
{
list.add(i);
}
for(Object o:list){ //使用for-each遍歷列表
System.out.println(o);
}
Iterator iter=list.iterator(); //返回一個(gè)迭代器類型
while(iter.hasNext()) //判斷迭代器中是否存在元素
{
System.out.println(iter.next()); //輸出迭代器中的元素
}
- getFirst() 返回此列表的第一個(gè)元素。
- getLast() 返回此列表的最后一個(gè)元素
- indexOf(Object o) 返回元素第一次出現(xiàn)的索引
- lastIndexOf(Object o) 返回元素最后一次出現(xiàn)的索引
- toArray() 返回以適當(dāng)順序(從第一個(gè)元素到最后一個(gè)元素)包含此列表中所有元素的數(shù)組
- set(index,element) 將指定索引的元素替換成element
- size() 返回元素的個(gè)數(shù)
- remove() 移除表頭的元素
- remove(index) 移除此列表中指定位置處的元素。
ArrayList
- List 接口的大小可變數(shù)組的實(shí)現(xiàn)。實(shí)現(xiàn)了所有可選列表操作,并允許包括 null 在內(nèi)的所有元素。除了實(shí)現(xiàn) List 接口外,此類還提供一些方法來操作內(nèi)部用來存儲(chǔ)列表的數(shù)組的大小。(此類大致上等同于 Vector 類,除了此類是不同步的。)
- 每個(gè) ArrayList 實(shí)例都有一個(gè)容量。該容量是指用來存儲(chǔ)列表元素的數(shù)組的大小。它總是至少等于列表的大小。隨著向 ArrayList 中不斷添加元素,其容量也自動(dòng)增長(zhǎng)。并未指定增長(zhǎng)策略的細(xì)節(jié),因?yàn)檫@不只是添加元素會(huì)帶來分?jǐn)偣潭〞r(shí)間開銷那樣簡(jiǎn)單。
- 注意,此實(shí)現(xiàn)不是同步的。如果多個(gè)線程同時(shí)訪問一個(gè) ArrayList 實(shí)例,而其中至少一個(gè)線程從結(jié)構(gòu)上修改了列表,那么它必須 保持外部同步。(結(jié)構(gòu)上的修改是指任何添加或刪除一個(gè)或多個(gè)元素的操作,或者顯式調(diào)整底層數(shù)組的大??;僅僅設(shè)置元素的值不是結(jié)構(gòu)上的修改。)這一般通過對(duì)自然封裝該列表的對(duì)象進(jìn)行同步操作來完成。如果不存在這樣的對(duì)象,則應(yīng)該使用 Collections.synchronizedList 方法將該列表“包裝”起來
構(gòu)造函數(shù)
- ArrayList() 構(gòu)造一個(gè)初始容量為 10 的空列表。
- ArrayList(Collection<? extends E> c) 構(gòu)造一個(gè)包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的。
- 構(gòu)造一個(gè)具有指定初始容量的空列表。
方法摘要
- 由于和LinkedList繼承了同一個(gè)接口,因此大部分的函數(shù)都是相同的,只是在拓展了一些特有的方法,共有的方法有:add,addAll,get,clone,clear,contains,indexOf,remove,set,size,toArray,lastIndexOf,iterator,listIterator。特有的方法如下:
- isEmpty() 如果此列表中沒有元素,則返回 true
- void trimToSize() 將此 ArrayList 實(shí)例的容量調(diào)整為列表的當(dāng)前大小。因?yàn)檫@里的線性列表的容量會(huì)隨著加入的元素而增加,因此這個(gè)函數(shù)的作用就是將線性列表的的容量變成當(dāng)成元素的大小
Vector
- Vector類可以實(shí)現(xiàn)可增長(zhǎng)的對(duì)象數(shù)組。與數(shù)組一樣,它包含可以使用整數(shù)索引進(jìn)行訪問的組件。但是,Vector 的大小可以根據(jù)需要增大或縮小,以適應(yīng)創(chuàng)建 Vector 后進(jìn)行添加或移除項(xiàng)的操作
- 每個(gè)向量會(huì)試圖通過維護(hù) capacity 和 capacityIncrement 來優(yōu)化存儲(chǔ)管理。capacity 始終至少應(yīng)與向量的大小相等;這個(gè)值通常比后者大些,因?yàn)殡S著將組件添加到向量中,其存儲(chǔ)將按 capacityIncrement 的大小增加存儲(chǔ)塊。應(yīng)用程序可以在插入大量組件前增加向量的容量;這樣就減少了增加的重分配的量。
- 從源碼中可以看出Vector是線程安全的,源碼中的插入和刪除操作都實(shí)現(xiàn)了進(jìn)程的同步語句塊,因此Vector的插入和刪除是比較低效的
構(gòu)造函數(shù)
- Vector() 構(gòu)造一個(gè)空向量,使其內(nèi)部數(shù)據(jù)數(shù)組的大小為 10,其標(biāo)準(zhǔn)容量增量為零。
- Vector(Collection<? extends E> c) 構(gòu)造一個(gè)包含指定 collection 中的元素的向量,這些元素按其 collection 的迭代器返回元素的順序排列。
- Vector(int initialCapacity) 使用指定的初始容量和等于零的容量增量構(gòu)造一個(gè)空向量。
- Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量構(gòu)造一個(gè)空的向量。
- 注意:使用第一種方法系統(tǒng)會(huì)自動(dòng)對(duì)向量進(jìn)行管理,若使用后兩種方法。則系統(tǒng)將根據(jù)參數(shù),initialcapacity設(shè)定向量對(duì)象的容量(即向量對(duì)象可存儲(chǔ)數(shù)據(jù)的大?。?,當(dāng)真正存放的數(shù)據(jù)個(gè)數(shù)超過容量時(shí)。系統(tǒng)會(huì)擴(kuò)充向量對(duì)象存儲(chǔ)容量.
方法摘要
同樣是繼承了List接口,因此大部分的方法都是一樣的,比如add,addAll,clear,clone,contains,remove,removeall
stack
Stack 類表示后進(jìn)先出(LIFO)的對(duì)象堆棧。它通過五個(gè)操作對(duì)類 Vector 進(jìn)行了擴(kuò)展 ,允許將向量視為堆棧。它提供了通常的 push 和 pop 操作,以及取堆棧頂點(diǎn)的 peek 方法、測(cè)試堆棧是否為空的 empty 方法、在堆棧中查找項(xiàng)并確定到堆棧頂距離的 search 方法。
注意:這里的stack雖然繼承了了Iterator接口但是如果使用了迭代的話它輸出的還是原來你輸入的順序,這里就違背了棧的原理后進(jìn)先出
構(gòu)造方法
Stack() 創(chuàng)建一個(gè)空堆棧。
方法摘要
- isEmpty() 測(cè)試堆棧是否為空。
- peek() 查看堆棧頂部的對(duì)象,但不從堆棧中移除它。
- pop() 移除堆棧頂部的對(duì)象,并作為此函數(shù)的值返回該對(duì)象。
- push(E element) 把項(xiàng)壓入堆棧頂部。
- search(Object o) 返回對(duì)象在堆棧中的位置,以 1 為基數(shù)。
以上所述是小編給大家介紹的JAVA中的Collection接口和其主要實(shí)現(xiàn)的類詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
Java swing框架實(shí)現(xiàn)的貪吃蛇游戲完整示例
這篇文章主要介紹了Java swing框架實(shí)現(xiàn)的貪吃蛇游戲,結(jié)合完整實(shí)例形式分析了java使用swing框架結(jié)合awt圖形繪制實(shí)現(xiàn)貪吃蛇游戲的具體步驟與相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
聊聊spring @Transactional 事務(wù)無法使用的可能原因
這篇文章主要介紹了spring @Transactional 事務(wù)無法使用的可能原因,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
關(guān)于mybatis-plus邏輯刪除自動(dòng)填充更新時(shí)間的問題
mybatis-plus是對(duì)mybatis的增強(qiáng),mybatis-plus更像是面向?qū)ο缶幊?,?shù)據(jù)庫(kù)基本CRUD的操作可以不用手動(dòng)編寫SQL語句,大大提高了開發(fā)的效率,這篇文章主要介紹了mybatis-plus邏輯刪除自動(dòng)填充更新時(shí)間問題,需要的朋友可以參考下2022-07-07
Java利用位運(yùn)算實(shí)現(xiàn)乘法運(yùn)算詳解
這篇文章主要為大家詳細(xì)介紹了Java如何用位運(yùn)算實(shí)現(xiàn)乘法運(yùn)算,在實(shí)現(xiàn)乘法時(shí)要用位運(yùn)算實(shí)現(xiàn),并且不能出現(xiàn)加減乘除任何符號(hào),感興趣的可以了解一下2023-04-04
Spring主配置文件(applicationContext.xml) 導(dǎo)入約束詳解
在本篇文章里我們給各位整理的是關(guān)于Spring主配置文件(applicationContext.xml) 導(dǎo)入約束的相關(guān)知識(shí)點(diǎn)內(nèi)容,需要參考下。2019-08-08
Java程序生成exe可執(zhí)行文件詳細(xì)教程(圖文說明)
這篇文章主要介紹了Java程序生成exe可執(zhí)行文件詳細(xì)教程,有需要的朋友可以參考一下2013-12-12

