JAVA中的Collection接口和其主要實現(xiàn)的類
Collection
是最基本的集合接口蒜焊,一個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优妙,這兩個接口實現(xiàn)了主要的方法,但是還是有一些拓展的憎账,不如list中的迭代就和collection中的有些不同套硼,下面會詳細(xì)介紹,這里我們用一個例子體會一下這里的接口的實現(xiàn):
Collection<Integer> list=new LinkedList<>();
list
list
是有序的collection
(也稱為序列)胞皱。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制邪意。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素反砌。list
與Set
不同雾鬼,list允許重復(fù)的元素插入- list接口提供了兩種在列表的任意位置高效插入和移除多個元素的方法。
- 下面我們來具體介紹一下它的實現(xiàn)的類
LinkedList
從文檔中可以看到這個listedList實現(xiàn)的不只是list接口宴树,比如還是實現(xiàn)了Deque接口策菜,這個為 add、poll 提供先進先出隊列操作森渐,以及其他堆棧和雙端隊列操作做入。這里的LinkedList都是用雙向鏈表實現(xiàn)的,這個類不是同步的同衣,因此在多個線程中有修改其中的元素操作時必須實現(xiàn)外部的線程同步
構(gòu)造方法
LinkedList()
創(chuàng)建一個空的鏈表LinkedList(Collection<? extends E> c)
構(gòu)造一個包含指定 collection 中的元素的列表梯码,這些元素按其 collection 的迭代器返回的順序排列,構(gòu)造如下:
ArrayList<Integer> arrayList=new ArrayList<>(); //這里新建一個線性列表
LinkedList<Integer> linkedList=new LinkedList<Integer>(arrayList); //用線性列表新建一個鏈表
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();//新建一個線性表
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()
得到一個鏈表的副本耸携,由于其返回的類型是Object棵癣,因此需要進行強制轉(zhuǎn)換成LinkedList類型
LinkedList list=(LinkedList)linkedList.clone();
contains(Object o)
如果此列表中包含元素o返回Trueelement()
獲取但不移除此列表的頭(第一個元素)。iterator()
返回列表中的元素的迭代器
Iterator iter=list.iterator(); //返回一個迭代器類型
while(iter.hasNext()) //判斷迭代器中是否存在元素
{
Object o=iter.next();
if(o.equals(1))
{
System.out.println(o); //輸出迭代器中的元素
iter.remove(); //移除這個元素夺衍,這個是從列表中直接移除的
}
}
listIterator()
返回此列表中的元素的列表迭代器(按適當(dāng)順序)狈谊,從列表中指定位置開始
ListIterator iterator = list.listIterator();
while (iterator.hasNext()) //首先將迭代器一直運行到末尾
{
Object o = iterator.next();
if (o.equals(1)) {
iterator.add(100); //將元素插入到當(dāng)前元素的前面,這個在Iterator是不存在的方法
}
}
while (iterator.hasPrevious()) //這時的迭代器是從末尾開始的沟沙,因此這里相當(dāng)與逆序輸出
{
System.out.println(iterator.previous());
}
get(int index)
返回此列表中指定位置處的元素河劝。這里要注意的是雖然這種方式能夠得到指定索引的值,但是這里對于鏈表中的操作開銷是非常大的矛紫,因此這個方法不主張使用赎瞎,如果需要遍歷列表可以使用迭代器和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(); //返回一個迭代器類型
while(iter.hasNext()) //判斷迭代器中是否存在元素
{
System.out.println(iter.next()); //輸出迭代器中的元素
}
getFirst()
返回此列表的第一個元素。getLast()
返回此列表的最后一個元素indexOf(Object o)
返回元素第一次出現(xiàn)的索引lastIndexOf(Object o)
返回元素最后一次出現(xiàn)的索引toArray()
返回以適當(dāng)順序(從第一個元素到最后一個元素)包含此列表中所有元素的數(shù)組set(index,element)
將指定索引的元素替換成elementsize()
返回元素的個數(shù)remove()
移除表頭的元素remove(index)
移除此列表中指定位置處的元素颊咬。
ArrayList
List
接口的大小可變數(shù)組的實現(xiàn)务甥。實現(xiàn)了所有可選列表操作,并允許包括 null 在內(nèi)的所有元素喳篇。除了實現(xiàn) List 接口外敞临,此類還提供一些方法來操作內(nèi)部用來存儲列表的數(shù)組的大小。(此類大致上等同于 Vector 類杭隙,除了此類是不同步的哟绊。)- 每個
ArrayList
實例都有一個容量。該容量是指用來存儲列表元素的數(shù)組的大小痰憎。它總是至少等于列表的大小票髓。隨著向 ArrayList 中不斷添加元素,其容量也自動增長铣耘。并未指定增長策略的細(xì)節(jié)洽沟,因為這不只是添加元素會帶來分?jǐn)偣潭〞r間開銷那樣簡單。- 注意蜗细,此實現(xiàn)不是同步的裆操。如果多個線程同時訪問一個 ArrayList 實例,而其中至少一個線程從結(jié)構(gòu)上修改了列表炉媒,那么它必須 保持外部同步踪区。(結(jié)構(gòu)上的修改是指任何添加或刪除一個或多個元素的操作,或者顯式調(diào)整底層數(shù)組的大械踔琛缎岗;僅僅設(shè)置元素的值不是結(jié)構(gòu)上的修改。)這一般通過對自然封裝該列表的對象進行同步操作來完成白粉。如果不存在這樣的對象传泊,則應(yīng)該使用 Collections.synchronizedList 方法將該列表“包裝”起來
構(gòu)造函數(shù)
ArrayList()
構(gòu)造一個初始容量為10
的空列表鼠渺。ArrayList(Collection<? extends E> c)
構(gòu)造一個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的眷细。- 構(gòu)造一個具有指定初始容量的空列表拦盹。
方法摘要
由于和
LinkedList
繼承了同一個接口,因此大部分的函數(shù)都是相同的溪椎,只是在拓展了一些特有的方法普舆,共有的方法有:add
,addAll
,get
,clone
,clear
,contains
,indexOf
,remove
,set
,size
,toArray
,lastIndexOf
,iterator
,listIterator
。特有的方法如下:
isEmpty()
如果此列表中沒有元素校读,則返回 truevoid trimToSize()
將此 ArrayList 實例的容量調(diào)整為列表的當(dāng)前大小奔害。因為這里的線性列表的容量會隨著加入的元素而增加,因此這個函數(shù)的作用就是將線性列表的的容量變成當(dāng)成元素的大小
Vector
Vector
類可以實現(xiàn)可增長的對象數(shù)組地熄。與數(shù)組一樣,它包含可以使用整數(shù)索引進行訪問的組件芯杀。但是端考,Vector 的大小可以根據(jù)需要增大或縮小,以適應(yīng)創(chuàng)建 Vector 后進行添加或移除項的操作- 每個向量會試圖通過維護 capacity 和 capacityIncrement 來優(yōu)化存儲管理揭厚。capacity 始終至少應(yīng)與向量的大小相等却特;這個值通常比后者大些,因為隨著將組件添加到向量中筛圆,其存儲將按 capacityIncrement 的大小增加存儲塊裂明。應(yīng)用程序可以在插入大量組件前增加向量的容量;這樣就減少了增加的重分配的量太援。
- 從源碼中可以看出Vector是線程安全的闽晦,源碼中的插入和刪除操作都實現(xiàn)了進程的同步語句塊,因此Vector的插入和刪除是比較低效的
構(gòu)造函數(shù)
Vector()
構(gòu)造一個空向量提岔,使其內(nèi)部數(shù)據(jù)數(shù)組的大小為 10仙蛉,其標(biāo)準(zhǔn)容量增量為零。Vector(Collection<? extends E> c)
構(gòu)造一個包含指定 collection 中的元素的向量碱蒙,這些元素按其 collection 的迭代器返回元素的順序排列荠瘪。Vector(int initialCapacity)
使用指定的初始容量和等于零的容量增量構(gòu)造一個空向量。Vector(int initialCapacity, int capacityIncrement)
使用指定的初始容量和容量增量構(gòu)造一個空的向量赛惩。
注意:使用第一種方法系統(tǒng)會自動對向量進行管理哀墓,若使用后兩種方法。則系統(tǒng)將根據(jù)參數(shù)喷兼,
initialcapacity
設(shè)定向量對象的容量(即向量對象可存儲數(shù)據(jù)的大欣捍隆),當(dāng)真正存放的數(shù)據(jù)個數(shù)超過容量時褒搔。系統(tǒng)會擴充向量對象存儲容量.
方法摘要
同樣是繼承了List接口阶牍,因此大部分的方法都是一樣的喷面,比如add,addAll,clear,clone,contains,remove,removeall
stack
Stack 類表示后進先出(LIFO)的對象堆棧。它通過五個操作對類 Vector 進行了擴展 走孽,允許將向量視為堆棧惧辈。它提供了通常的 push 和 pop 操作,以及取堆棧頂點的 peek 方法磕瓷、測試堆棧是否為空的 empty 方法盒齿、在堆棧中查找項并確定到堆棧頂距離的 search 方法。
注意:這里的stack雖然繼承了了Iterator接口但是如果使用了迭代的話它輸出的還是原來你輸入的順序困食,這里就違背了棧的原理后進先出
構(gòu)造方法
Stack()
創(chuàng)建一個空堆棧边翁。
方法摘要
isEmpty()
測試堆棧是否為空。peek()
查看堆棧頂部的對象硕盹,但不從堆棧中移除它符匾。pop()
移除堆棧頂部的對象,并作為此函數(shù)的值返回該對象瘩例。push(E element)
把項壓入堆棧頂部啊胶。search(Object o)
返回對象在堆棧中的位置,以 1 為基數(shù)垛贤。