Java集合操作之List接口及其實(shí)現(xiàn)方法詳解
在介紹List接口之前,我們先來看看 Collection 接口,因?yàn)镃ollection接口是 List / Set / Queue 接口的父接口,List / Set / Queue 的實(shí)現(xiàn)類中很多的操作方法其實(shí)還是調(diào)用Collection類定義的方法。
一、Collection接口
在Collection接口中,定義了如下的方法:
其中方法可以分為以下幾類:
數(shù)據(jù)操作類方法:add/addAll/remove/removeAll/clear/retainAll/iterator
判斷類方法:contains/containsAll/equals/hashcode/isEmpty/size
所有繼承 Collection 接口的集合都可以用 Collection 中的方法進(jìn)行元素操作,而具體的集合類有根據(jù)其特性增加了一些其特有的方法。
1、數(shù)據(jù)操作類方法:add/addAll/remove/removeAll/clear/retainAll/iterator
Collection接口-數(shù)據(jù)操作類方法MARK
2、判斷類方法:contains/containsAll/equals/hashcode/isEmpty/size
package com.chanshuyi.collection; import java.util.ArrayList; import java.util.Collection; /** * Collection接口-判斷類方法 * contains/containsAll/equals/hashcode/isEmpty/size * @author Administrator * */ public class CollectionTest2 { public static void main(String[] args) { Collection<String> listCol = new ArrayList<String>(); listCol.add("1"); listCol.add("2"); listCol.add("3"); Collection<String> addCol = new ArrayList<String>(); addCol.add("4"); addCol.add("5"); addCol.add("6"); //1.是否包含 contains() //true System.out.println("listCol是否包含1:" + listCol.contains("1")); //2.是否包含集合中所有元素 containAlls() //false System.out.println("listCol是否包含addCol中所有元素:" + listCol.containsAll(addCol)); //3.listCol與addCol是否相等 equals() //false System.out.println("listCol與addCol是否相等:" + listCol.equals(addCol)); //4.listCol與addCol的哈希碼是否相等 hashcode() //78481,81460 System.out.println("listCol與addCol的哈希碼是否相等:" + listCol.hashCode() + "," + addCol.hashCode()); //5.listCol是否為空 isEmpty() //false System.out.println("listCol是否為空:" + listCol.isEmpty()); //6.listCol的大小 size() //3 System.out.println("listCol大?。? + listCol.size()); System.out.println("====================================="); addCol.clear(); addCol.add("1"); addCol.add("2"); addCol.add("3"); //true System.out.println("listCol是否包含1:" + listCol.contains("1")); //true System.out.println("listCol是否包含addCol中所有元素:" + listCol.containsAll(addCol)); //true System.out.println("listCol與addCol是否相等:" + listCol.equals(addCol)); //78481,78481 System.out.println("listCol與addCol的哈希碼是否相等:" + listCol.hashCode() + "," + addCol.hashCode()); //false System.out.println("listCol是否為空:" + listCol.isEmpty()); //3 System.out.println("listCol大小:" + listCol.size()); System.out.println("====================================="); } }
Collection接口-判斷類方法
二、List接口
List接口在Collection接口的基礎(chǔ)上拓展了一些方法,增加了一些自己獨(dú)有的方法,主要是增加了這樣的幾類方法:
1、在 add / remove / addAll 中增加了 index 參數(shù),使其可以在任意位置插入刪除
add(int index, E element) / addAll(int index, E element)
可以在特定位置插入刪除元素,而不只是插入集合末尾
remove(int index)
刪除集合中特定下標(biāo)的元素(removeAll() 是移除集合所有元素,暫時(shí)沒有移除一個(gè)區(qū)間的元素的 API。但 ArrayList 類實(shí)現(xiàn)了,對(duì)應(yīng)的方法是: removeRange(int fromIndex, int toIndex) )
package com.chanshuyi.collection.list; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class ListTest1 { public static void main(String[] args) { Collection<String> addCol = new ArrayList<String>(); addCol.add("4"); addCol.add("5"); addCol.add("6"); List<String> strList = new ArrayList<String>(); strList.add("1"); strList.add("3"); //1.在特定位置插入刪除元素 add(int index, E element) strList.add(1, "2"); //在index前加而不是后 printCol(strList); //1 2 3 strList.remove(0); printCol(strList); //2 3 //2.在特定位置插入刪除集合 addAll(int index, E element) strList.addAll(addCol); printCol(strList); //2 3 4 5 6 //3.刪除集合中特定下標(biāo)的元素 remove(int index) strList.remove(0); printCol(strList); //3 4 5 6 //4.獲?。ǜ拢┨囟ㄎ恢蒙系脑?get(int index) System.out.println("第一個(gè)元素:" + strList.get(0)); //第一個(gè)元素:3 strList.set(0, "1"); //5.設(shè)置特定位置元素的值 set(int index,Element e) printCol(strList); //1 4 5 6 //獲取子集合 List<String> subList = strList.subList(1, strList.size()); printCol(subList); //4 5 6 //獲取特定元素下標(biāo) indexOf() //5的下標(biāo)是:2 System.out.println("5的下標(biāo)是:" + strList.indexOf("5")); //獲取元素最后一次出現(xiàn)的下標(biāo) lastIndexOf() //5的下標(biāo)是:2 System.out.println("5的下標(biāo)是:" + strList.lastIndexOf("5")); printCol(strList); //1 4 5 6 //獲取一個(gè)ListIterator對(duì)象 listIterator() /*沒有前一個(gè)值 本對(duì)象是:1 前一個(gè)對(duì)象值:1 本對(duì)象是:4 前一個(gè)對(duì)象值:4 本對(duì)象是:5 前一個(gè)對(duì)象值:5 本對(duì)象是:6*/ System.out.println("======================================"); ListIterator<String> it = strList.listIterator(); while(it.hasNext()){ if(it.hasPrevious()){ System.out.print("前一個(gè)對(duì)象值:" + it.previous()); it.next(); }else{ System.out.print("沒有前一個(gè)值"); } System.out.print(" 本對(duì)象是:" + it.next() + "\n"); } System.out.println("======================================"); //獲取一個(gè)ListIterator對(duì)象 listIterator(int index) /* * 前一個(gè)對(duì)象值:1 本對(duì)象是:4 前一個(gè)對(duì)象值:4 本對(duì)象是:5 前一個(gè)對(duì)象值:5 本對(duì)象是:6 */ it = strList.listIterator(1); //從第一個(gè)開始迭代遍歷 while(it.hasNext()){ if(it.hasPrevious()){ System.out.print("前一個(gè)對(duì)象值:" + it.previous()); it.next(); }else{ System.out.print("沒有前一個(gè)值"); } System.out.print(" 本對(duì)象是:" + it.next() + "\n"); } } public static <E> void printCol(Collection<E> col){ Iterator<E> it = col.iterator(); while(it.hasNext()){ System.out.print(it.next().toString() + " "); } System.out.println(); } }
2、增加了獲取元素以及設(shè)置元素值的方法
get(int index) / set(int index, E element)
可以獲取(設(shè)置)特定位置上的元素
package com.chanshuyi.collection.list; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; public class ListTest2 { public static void main(String[] args) { Collection<String> addCol = new ArrayList<String>(); addCol.add("4"); addCol.add("5"); addCol.add("6"); List<String> strList = new ArrayList<String>(); strList.add("1"); strList.add("3"); //4.獲?。ǜ拢┨囟ㄎ恢蒙系脑?get(int index) System.out.println("第一個(gè)元素:" + strList.get(0)); //第一個(gè)元素:3 strList.set(0, "1"); //5.設(shè)置特定位置元素的值 set(int index,Element e) printCol(strList); //1 4 5 6 } public static <E> void printCol(Collection<E> col){ Iterator<E> it = col.iterator(); while(it.hasNext()){ System.out.print(it.next().toString() + " "); } System.out.println(); } }
3、其他方法
- subList(int fromIndex, int toIndex) 獲取子集合
- indexOf(Object o) / lastIndexOf(Object o) 獲取特定元素下標(biāo)
- listIterator() / listIterator(int index) 獲取一個(gè)ListIterator對(duì)象(ListIterator對(duì)象具有比Iterator更強(qiáng)大的遍歷集合功能。Iterator只能向后遍歷,但ListIterator擴(kuò)展了Iterator接口,不僅可以向后遍歷也可以向前遍歷)
package com.chanshuyi.collection.list; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import java.util.ListIterator; public class ListTest3 { public static void main(String[] args) { Collection<String> addCol = new ArrayList<String>(); addCol.add("4"); addCol.add("5"); addCol.add("6"); List<String> strList = new ArrayList<String>(); strList.add("1"); strList.add("3"); //5.獲取子集合 List<String> subList = strList.subList(1, strList.size()); printCol(subList); //4 5 6 //6.獲取特定元素下標(biāo) indexOf() System.out.println("5的下標(biāo)是:" + strList.indexOf("5")); //2 //7.獲取元素最后一次出現(xiàn)的下標(biāo) lastIndexOf() System.out.println("5的下標(biāo)是:" + strList.lastIndexOf("5")); //2 printCol(strList); //1 4 5 6 //8.獲取一個(gè)ListIterator對(duì)象 listIterator() /*沒有前一個(gè)值 本對(duì)象是:1 前一個(gè)對(duì)象值:1 本對(duì)象是:4 前一個(gè)對(duì)象值:4 本對(duì)象是:5 前一個(gè)對(duì)象值:5 本對(duì)象是:6*/ System.out.println("======================================"); ListIterator<String> it = strList.listIterator(); while(it.hasNext()){ if(it.hasPrevious()){ System.out.print("前一個(gè)對(duì)象值:" + it.previous()); it.next(); }else{ System.out.print("沒有前一個(gè)值"); } System.out.print(" 本對(duì)象是:" + it.next() + "\n"); } System.out.println("======================================"); //9.獲取一個(gè)ListIterator對(duì)象 listIterator(int index) /* * 前一個(gè)對(duì)象值:1 本對(duì)象是:4 前一個(gè)對(duì)象值:4 本對(duì)象是:5 前一個(gè)對(duì)象值:5 本對(duì)象是:6 */ it = strList.listIterator(1); //從第一個(gè)開始迭代遍歷 while(it.hasNext()){ if(it.hasPrevious()){ System.out.print("前一個(gè)對(duì)象值:" + it.previous()); it.next(); }else{ System.out.print("沒有前一個(gè)值"); } System.out.print(" 本對(duì)象是:" + it.next() + "\n"); } } public static <E> void printCol(Collection<E> col){ Iterator<E> it = col.iterator(); while(it.hasNext()){ System.out.print(it.next().toString() + " "); } System.out.println(); } }
三、ArrayList實(shí)現(xiàn)類
在ArayList實(shí)現(xiàn)類中,我們通常用Collection接口提供的add/addAll/remove/removeAll/iterator方法進(jìn)行數(shù)據(jù)的增刪改查:
package com.chanshuyi.collection.list; import java.util.ArrayList; import java.util.Iterator; public class ArrayListTest1 { public static void main(String[] args) { //增加 ArrayList<String> listCol = new ArrayList<String>(); listCol.add("1"); listCol.add("2"); listCol.add("3"); //刪除 listCol.remove("1"); //修改 List接口方法 //迭代 Iterator<String> it = listCol.iterator(); while(it.hasNext()){ System.out.print(it.next().toString() + " "); } System.out.println(); } }
然而ArrayList實(shí)現(xiàn)類比起List接口,ArrayList實(shí)現(xiàn)類擁有了以下幾個(gè)特有的方法:
- clone() 復(fù)制一個(gè)集合實(shí)例
- removeRange(int fromIndex, int toIndex) 移除指定范圍內(nèi)的元素
- ensureCapacity(int minCapacity) 擴(kuò)大集合大小,使其至少容納minCpacity個(gè)元素
- trimToSize() 縮小集合大小到其現(xiàn)在的大小
package com.chanshuyi.collection.list; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * ArrayList 有序允許重復(fù) 非線程同步 * @author Administrator */ public class ArrayListTest{ public static void main(String[] args) { //增加 ArrayList<String> nameList = new ArrayList<String>(); nameList.add("Tom"); nameList.add("Marry"); nameList.add("Henry"); nameList.add("Jensus"); //1.復(fù)制集合 @SuppressWarnings("unchecked") ArrayList<String> copyList = (ArrayList<String>) nameList.clone(); //Tom Marry Henry Jensus printCol(nameList); //Tom Marry Henry Jensus printCol(copyList); //2.擴(kuò)大集合大小 nameList.ensureCapacity(8); //3.縮小集合大小 //集合大?。? System.out.println("集合大?。? + nameList.size()); nameList.trimToSize(); //集合大?。? System.out.println("集合大小:" + nameList.size()); } public static <E> void printCol(Collection<E> col){ Iterator<E> it = col.iterator(); while(it.hasNext()){ System.out.print(it.next().toString() + " "); } System.out.println(); } }
- removeRange(int fromIndex, int toIndex) 方法是protected方法,只能在包內(nèi)或子類中使用,因此如果要使用removeRange方法,只能用繼承ArrayList類的方法構(gòu)造一個(gè)類,然后用這個(gè)類去調(diào)用removeRange()方法,如:
package com.chanshuyi.collection.list; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; @SuppressWarnings("serial") public class ArrayListTest2<E> extends ArrayList<E> { public static void main(String[] args) { ArrayListTest2<String> list = new ArrayListTest2<String>(); list.add("1"); list.add("2"); list.add("3"); list.removeRange(1, 2); printCol(list); //1 3 } public static <E> void printCol(Collection<E> col){ Iterator<E> it = col.iterator(); while(it.hasNext()){ System.out.print(it.next().toString() + " "); } System.out.println(); } }
四、LinkedList實(shí)現(xiàn)類
LinkedList同樣實(shí)現(xiàn)了Collection和List接口,所以同樣可以用這兩個(gè)接口中的方法進(jìn)行數(shù)據(jù)操作:
package com.chanshuyi.collection.list; import java.util.Iterator; import java.util.LinkedList; import java.util.List; public class LinkedListTest { public static void main(String[] args) { //增加 List<String> linkedList = new LinkedList<String>(); linkedList.add("one"); linkedList.add("two"); linkedList.add("three"); linkedList.add("four"); linkedList.add("five"); linkedList.add(0, "Middle"); //刪除 linkedList.remove(4); linkedList.remove("five"); //修改 linkedList.set(1, "1"); //查詢 System.out.println(linkedList.get(0)); //Middle //迭代1 //Middle 1 two three for(String numStr : linkedList){ System.out.print(numStr + " "); } System.out.println(); //迭代2 //Middle 1 two three Iterator<String> it = linkedList.iterator(); while(it.hasNext()){ System.out.print(it.next() + " "); } } }
但其實(shí)LinkedList類也實(shí)現(xiàn)了DQueue接口,所以LinkedList也可以使用push/pop等方法進(jìn)行堆棧結(jié)構(gòu)的操作,但這不屬于Collection和List的范圍,因此我們將在Queue接口時(shí)進(jìn)行介紹。
五、Vector實(shí)現(xiàn)類
Vector實(shí)現(xiàn)類與ArrayList實(shí)現(xiàn)類的區(qū)別就是Vector是線程安全的,而ArrayList是線程不安全的,因此Vector效率較低。因此在非多線程的情況下推薦用ArrayList,而在多線程環(huán)境下適合用Vector。
一般操作Vector時(shí)也是使用Collection接口和List接口提供的方法:
package com.chanshuyi.collection.list; import java.util.Iterator; import java.util.Vector; public class VectorTest { public static void main(String[] args) { //增加 add() Vector<String> vector = new Vector<String>(); vector.add("Tom"); vector.add("Marry"); vector.add("Jesus"); vector.add("Json"); //刪除 remove() vector.remove(0); vector.remove("Marry"); //修改 vector.set(0, "JesusCopy"); //查詢 get() System.out.println(vector.get(0)); //迭代1 for(String name : vector){ System.out.print(name + " "); } System.out.println(); //迭代2 Iterator<String> it = vector.iterator(); while(it.hasNext()){ System.out.print(it.next() + " "); } } }
六、Stack實(shí)現(xiàn)類
Stack類是Vector類的子類,因此它也可以用Collection和List接口提供的add/remove等方法。
Stack類是堆棧結(jié)構(gòu)的一個(gè)模擬,實(shí)現(xiàn)了自己獨(dú)有的進(jìn)棧、出棧等方法。
package com.chanshuyi.collection.list; import java.util.Stack; public class StackTest { public static void main(String[] args) { //入棧 push() Stack<String> stack = new Stack<String>(); stack.push("1"); stack.push("2"); stack.push("3"); //出棧 pop() stack.pop(); //取得棧頂元素 peek() System.out.println(stack.peek()); //通過堆棧是否為空來迭代 isEmpty() while(!stack.isEmpty()){ System.out.print(stack.pop() + " "); } } }
相關(guān)文章
Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗(yàn)證過程
這篇文章主要為大家介紹了Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗(yàn)證過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪<BR>2023-02-02SpringBoot如何根據(jù)目錄路徑生成接口的url路徑
這篇文章主要介紹了SpringBoot如何根據(jù)目錄路徑生成接口的url路徑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11JPA使用樂觀鎖應(yīng)對(duì)高并發(fā)方式
這篇文章主要介紹了JPA使用樂觀鎖應(yīng)對(duì)高并發(fā)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10java隨機(jī)數(shù)生成具體實(shí)現(xiàn)代碼
這篇文章主要為大家分享了java隨機(jī)數(shù)生成具體實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-04-04springboot使用Mybatis-plus分頁插件的案例詳解
這篇文章主要介紹了springboot使用Mybatis-plus分頁插件的相關(guān)知識(shí),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-05-05Gradle下如何搭建SpringCloud分布式環(huán)境
這篇文章主要介紹了Gradle下如何搭建SpringCloud分布式環(huán)境問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-05-05基于Flyway實(shí)現(xiàn)簡化Spring Boot項(xiàng)目部署
這篇文章主要介紹了基于Flyway實(shí)現(xiàn)簡化Spring Boot項(xiàng)目部署,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-06-06Java實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法的示例代碼
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)優(yōu)先隊(duì)列式廣度優(yōu)先搜索算法,文中通過一個(gè)示例帶大家具體了解了實(shí)現(xiàn)的方法,需要的可以參考一下2022-08-08tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼
本文主要介紹了tk.mybatis實(shí)現(xiàn)uuid主鍵生成的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12