欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

詳解JAVA中的Collection接口和其主要實(shí)現(xiàn)的類

 更新時間:2019年03月25日 09:53:50   作者:愛撒謊的男孩  
這篇文章主要介紹了JAVA中的Collection接口和其主要實(shí)現(xiàn)的類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

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,這兩個接口實(shí)現(xiàn)了主要的方法,但是還是有一些拓展的,不如list中的迭代就和collection中的有些不同,下面會詳細(xì)介紹,這里我們用一個例子體會一下這里的接口的實(shí)現(xiàn):

Collection<Integer> list=new LinkedList<>(); 

list

  1. list是有序的 collection(也稱為序列)。此接口的用戶可以對列表中每個元素的插入位置進(jìn)行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素。
  2. list與Set不同,list允許重復(fù)的元素插入
  3. list接口提供了兩種在列表的任意位置高效插入和移除多個元素的方法。
  4. 下面我們來具體介紹一下它的實(shí)現(xiàn)的類

 LinkedList

從文檔中可以看到這個listedList實(shí)現(xiàn)的不只是list接口,比如還是實(shí)現(xiàn)了Deque接口,這個為 add、poll 提供先進(jìn)先出隊(duì)列操作,以及其他堆棧和雙端隊(duì)列操作。這里的LinkedList都是用雙向鏈表實(shí)現(xiàn)的,這個類不是同步的,因此在多個線程中有修改其中的元素操作時必須實(shí)現(xiàn)外部的線程同步

構(gòu)造方法

  1. LinkedList() 創(chuàng)建一個空的鏈表
  2. 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()); 

方法摘要

  1. boolean add(E e) 將指定元素添加到此列表的結(jié)尾。成功插入返回True
  2. void add(int index, E element) 在此列表中指定的位置插入指定的元素。
  3. 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);
 }
  1. boolean addAll(int index, Collection<? extends E> c) 將指定 collection 中的所有元素從指定位置開始插入此列表。
  2. addFirst 將指定的元素添加到開頭
  3. addLast 將指定的元素添加到末尾
  4. clear() 從列表中移除全部的元素
  5. clone() 得到一個鏈表的副本,由于其返回的類型是Object,因此需要進(jìn)行強(qiáng)制轉(zhuǎn)換成LinkedList類型
LinkedList list=(LinkedList)linkedList.clone();
  1. contains(Object o) 如果此列表中包含元素o返回True
  2. element() 獲取但不移除此列表的頭(第一個元素)。
  3. iterator() 返回列表中的元素的迭代器
Iterator iter=list.iterator(); //返回一個迭代器類型
while(iter.hasNext()) //判斷迭代器中是否存在元素
{
 Object o=iter.next(); 
 if(o.equals(1))
 {
 System.out.println(o); //輸出迭代器中的元素
 iter.remove(); //移除這個元素,這個是從列表中直接移除的
}

}
  1. 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)前元素的前面,這個在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()); //輸出迭代器中的元素
}
  1. getFirst() 返回此列表的第一個元素。
  2. getLast() 返回此列表的最后一個元素
  3. indexOf(Object o) 返回元素第一次出現(xiàn)的索引
  4. lastIndexOf(Object o) 返回元素最后一次出現(xiàn)的索引
  5. toArray() 返回以適當(dāng)順序(從第一個元素到最后一個元素)包含此列表中所有元素的數(shù)組
  6. set(index,element) 將指定索引的元素替換成element
  7. size() 返回元素的個數(shù)
  8. remove() 移除表頭的元素
  9. remove(index) 移除此列表中指定位置處的元素。

ArrayList

  1. List 接口的大小可變數(shù)組的實(shí)現(xiàn)。實(shí)現(xiàn)了所有可選列表操作,并允許包括 null 在內(nèi)的所有元素。除了實(shí)現(xiàn) List 接口外,此類還提供一些方法來操作內(nèi)部用來存儲列表的數(shù)組的大小。(此類大致上等同于 Vector 類,除了此類是不同步的。)
  2. 每個 ArrayList 實(shí)例都有一個容量。該容量是指用來存儲列表元素的數(shù)組的大小。它總是至少等于列表的大小。隨著向 ArrayList 中不斷添加元素,其容量也自動增長。并未指定增長策略的細(xì)節(jié),因?yàn)檫@不只是添加元素會帶來分?jǐn)偣潭〞r間開銷那樣簡單。
  3. 注意,此實(shí)現(xiàn)不是同步的。如果多個線程同時訪問一個 ArrayList 實(shí)例,而其中至少一個線程從結(jié)構(gòu)上修改了列表,那么它必須 保持外部同步。(結(jié)構(gòu)上的修改是指任何添加或刪除一個或多個元素的操作,或者顯式調(diào)整底層數(shù)組的大??;僅僅設(shè)置元素的值不是結(jié)構(gòu)上的修改。)這一般通過對自然封裝該列表的對象進(jìn)行同步操作來完成。如果不存在這樣的對象,則應(yīng)該使用 Collections.synchronizedList 方法將該列表“包裝”起來

構(gòu)造函數(shù)

  1. ArrayList() 構(gòu)造一個初始容量為 10 的空列表。
  2. ArrayList(Collection<? extends E> c) 構(gòu)造一個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的。
  3. 構(gòu)造一個具有指定初始容量的空列表。

方法摘要

  1. 由于和LinkedList繼承了同一個接口,因此大部分的函數(shù)都是相同的,只是在拓展了一些特有的方法,共有的方法有:add,addAll,get,clone,clear,contains,indexOf,remove,set,size,toArray,lastIndexOf,iterator,listIterator。特有的方法如下:
  2. isEmpty() 如果此列表中沒有元素,則返回 true
  3. void trimToSize() 將此 ArrayList 實(shí)例的容量調(diào)整為列表的當(dāng)前大小。因?yàn)檫@里的線性列表的容量會隨著加入的元素而增加,因此這個函數(shù)的作用就是將線性列表的的容量變成當(dāng)成元素的大小

 Vector

  1. Vector類可以實(shí)現(xiàn)可增長的對象數(shù)組。與數(shù)組一樣,它包含可以使用整數(shù)索引進(jìn)行訪問的組件。但是,Vector 的大小可以根據(jù)需要增大或縮小,以適應(yīng)創(chuàng)建 Vector 后進(jìn)行添加或移除項(xiàng)的操作
  2. 每個向量會試圖通過維護(hù) capacity 和 capacityIncrement 來優(yōu)化存儲管理。capacity 始終至少應(yīng)與向量的大小相等;這個值通常比后者大些,因?yàn)殡S著將組件添加到向量中,其存儲將按 capacityIncrement 的大小增加存儲塊。應(yīng)用程序可以在插入大量組件前增加向量的容量;這樣就減少了增加的重分配的量。
  3. 從源碼中可以看出Vector是線程安全的,源碼中的插入和刪除操作都實(shí)現(xiàn)了進(jìn)程的同步語句塊,因此Vector的插入和刪除是比較低效的

構(gòu)造函數(shù)

  1. Vector() 構(gòu)造一個空向量,使其內(nèi)部數(shù)據(jù)數(shù)組的大小為 10,其標(biāo)準(zhǔn)容量增量為零。
  2. Vector(Collection<? extends E> c) 構(gòu)造一個包含指定 collection 中的元素的向量,這些元素按其 collection 的迭代器返回元素的順序排列。
  3. Vector(int initialCapacity) 使用指定的初始容量和等于零的容量增量構(gòu)造一個空向量。
  4. Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量構(gòu)造一個空的向量。
  5. 注意:使用第一種方法系統(tǒng)會自動對向量進(jìn)行管理,若使用后兩種方法。則系統(tǒng)將根據(jù)參數(shù),initialcapacity設(shè)定向量對象的容量(即向量對象可存儲數(shù)據(jù)的大小),當(dāng)真正存放的數(shù)據(jù)個數(shù)超過容量時。系統(tǒng)會擴(kuò)充向量對象存儲容量.

方法摘要

同樣是繼承了List接口,因此大部分的方法都是一樣的,比如add,addAll,clear,clone,contains,remove,removeall

stack

Stack 類表示后進(jìn)先出(LIFO)的對象堆棧。它通過五個操作對類 Vector 進(jìn)行了擴(kuò)展 ,允許將向量視為堆棧。它提供了通常的 push 和 pop 操作,以及取堆棧頂點(diǎn)的 peek 方法、測試堆棧是否為空的 empty 方法、在堆棧中查找項(xiàng)并確定到堆棧頂距離的 search 方法。
注意:這里的stack雖然繼承了了Iterator接口但是如果使用了迭代的話它輸出的還是原來你輸入的順序,這里就違背了棧的原理后進(jìn)先出

構(gòu)造方法

Stack() 創(chuàng)建一個空堆棧。

方法摘要

  1. isEmpty() 測試堆棧是否為空。
  2. peek() 查看堆棧頂部的對象,但不從堆棧中移除它。
  3. pop() 移除堆棧頂部的對象,并作為此函數(shù)的值返回該對象。
  4. push(E element) 把項(xiàng)壓入堆棧頂部。
  5. search(Object o) 返回對象在堆棧中的位置,以 1 為基數(shù)。

以上所述是小編給大家介紹的JAVA中的Collection接口和其主要實(shí)現(xiàn)的類詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!

相關(guān)文章

最新評論