溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在JAVA項目中實現(xiàn)一個Collection接口類

發(fā)布時間:2021-01-28 09:44:52 來源:億速云 閱讀:152 作者:Leah 欄目:編程語言

如何在JAVA項目中實現(xiàn)一個Collection接口類?針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。

Collection是最基本的集合接口,一個Collection代表一組Object,即Collection的元素(Elements)。一些Collection允許相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接繼承自Collection的類,Java SDK提供的類都是繼承自Collection的“子接口”如List和Set,詳細信息可見官方文檔http://tool.oschina.net/uploads/apidocs/jdk-zh/java/util/Collection.html,下面我們來討論繼承它的接口list,Set,這兩個接口實現(xiàn)了主要的方法,但是還是有一些拓展的,不如list中的迭代就和collection中的有些不同,下面會詳細介紹,這里我們用一個例子體會一下這里的接口的實現(xiàn):

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

list

  1. list是有序的 collection(也稱為序列)。此接口的用戶可以對列表中每個元素的插入位置進行精確地控制。用戶可以根據(jù)元素的整數(shù)索引(在列表中的位置)訪問元素,并搜索列表中的元素。

  2. list與Set不同,list允許重復的元素插入

  3. list接口提供了兩種在列表的任意位置高效插入和移除多個元素的方法。

  4. 下面我們來具體介紹一下它的實現(xiàn)的類

 LinkedList

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

構造方法

  1. LinkedList() 創(chuàng)建一個空的鏈表

  2. LinkedList(Collection<? extends E> c) 構造一個包含指定 collection 中的元素的列表,這些元素按其 collection 的迭代器返回的順序排列,構造如下:

 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,因此需要進行強制轉(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() 返回此列表中的元素的列表迭代器(按適當順序),從列表中指定位置開始

ListIterator iterator = list.listIterator();
 while (iterator.hasNext()) //首先將迭代器一直運行到末尾
 {
  Object o = iterator.next();
  if (o.equals(1)) {
  iterator.add(100); //將元素插入到當前元素的前面,這個在Iterator是不存在的方法
  }

 }

 while (iterator.hasPrevious()) //這時的迭代器是從末尾開始的,因此這里相當與逆序輸出
 {
  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() 返回以適當順序(從第一個元素到最后一個元素)包含此列表中所有元素的數(shù)組

  6. set(index,element) 將指定索引的元素替換成element

  7. size() 返回元素的個數(shù)

  8. remove() 移除表頭的元素

  9. remove(index) 移除此列表中指定位置處的元素。

ArrayList

  1. List 接口的大小可變數(shù)組的實現(xiàn)。實現(xiàn)了所有可選列表操作,并允許包括 null 在內(nèi)的所有元素。除了實現(xiàn) List 接口外,此類還提供一些方法來操作內(nèi)部用來存儲列表的數(shù)組的大小。(此類大致上等同于 Vector 類,除了此類是不同步的。)

  2. 每個 ArrayList 實例都有一個容量。該容量是指用來存儲列表元素的數(shù)組的大小。它總是至少等于列表的大小。隨著向 ArrayList 中不斷添加元素,其容量也自動增長。并未指定增長策略的細節(jié),因為這不只是添加元素會帶來分攤固定時間開銷那樣簡單。

  3. 注意,此實現(xiàn)不是同步的。如果多個線程同時訪問一個 ArrayList 實例,而其中至少一個線程從結(jié)構上修改了列表,那么它必須 保持外部同步。(結(jié)構上的修改是指任何添加或刪除一個或多個元素的操作,或者顯式調(diào)整底層數(shù)組的大?。粌H僅設置元素的值不是結(jié)構上的修改。)這一般通過對自然封裝該列表的對象進行同步操作來完成。如果不存在這樣的對象,則應該使用 Collections.synchronizedList 方法將該列表“包裝”起來

構造函數(shù)

  1. ArrayList() 構造一個初始容量為 10 的空列表。

  2. ArrayList(Collection<? extends E> c) 構造一個包含指定 collection 的元素的列表,這些元素是按照該 collection 的迭代器返回它們的順序排列的。

  3. 構造一個具有指定初始容量的空列表。

方法摘要

  1. 由于和LinkedList繼承了同一個接口,因此大部分的函數(shù)都是相同的,只是在拓展了一些特有的方法,共有的方法有:add,addAll,get,clone,clear,contains,indexOf,remove,set,size,toArray,lastIndexOf,iterator,listIterator。特有的方法如下:

  2. isEmpty() 如果此列表中沒有元素,則返回 true

  3. void trimToSize() 將此 ArrayList 實例的容量調(diào)整為列表的當前大小。因為這里的線性列表的容量會隨著加入的元素而增加,因此這個函數(shù)的作用就是將線性列表的的容量變成當成元素的大小

 Vector

  1. Vector類可以實現(xiàn)可增長的對象數(shù)組。與數(shù)組一樣,它包含可以使用整數(shù)索引進行訪問的組件。但是,Vector 的大小可以根據(jù)需要增大或縮小,以適應創(chuàng)建 Vector 后進行添加或移除項的操作

  2. 每個向量會試圖通過維護 capacity 和 capacityIncrement 來優(yōu)化存儲管理。capacity 始終至少應與向量的大小相等;這個值通常比后者大些,因為隨著將組件添加到向量中,其存儲將按 capacityIncrement 的大小增加存儲塊。應用程序可以在插入大量組件前增加向量的容量;這樣就減少了增加的重分配的量。

  3. 從源碼中可以看出Vector是線程安全的,源碼中的插入和刪除操作都實現(xiàn)了進程的同步語句塊,因此Vector的插入和刪除是比較低效的

構造函數(shù)

  1. Vector() 構造一個空向量,使其內(nèi)部數(shù)據(jù)數(shù)組的大小為 10,其標準容量增量為零。

  2. Vector(Collection<? extends E> c) 構造一個包含指定 collection 中的元素的向量,這些元素按其 collection 的迭代器返回元素的順序排列。

  3. Vector(int initialCapacity) 使用指定的初始容量和等于零的容量增量構造一個空向量。

  4. Vector(int initialCapacity, int capacityIncrement) 使用指定的初始容量和容量增量構造一個空的向量。

  5. 注意:使用第一種方法系統(tǒng)會自動對向量進行管理,若使用后兩種方法。則系統(tǒng)將根據(jù)參數(shù),initialcapacity設定向量對象的容量(即向量對象可存儲數(shù)據(jù)的大?。斦嬲娣诺臄?shù)據(jù)個數(shù)超過容量時。系統(tǒng)會擴充向量對象存儲容量.

方法摘要

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

stack

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

構造方法

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

方法摘要

  1. isEmpty() 測試堆棧是否為空。

  2. peek() 查看堆棧頂部的對象,但不從堆棧中移除它。

  3. pop() 移除堆棧頂部的對象,并作為此函數(shù)的值返回該對象。

  4. push(E element) 把項壓入堆棧頂部。

  5. search(Object o) 返回對象在堆棧中的位置,以 1 為基數(shù)。

關于如何在JAVA項目中實現(xiàn)一個Collection接口類問題的解答就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業(yè)資訊頻道了解更多相關知識。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內(nèi)容。

AI