Java集合操作之List接口及其實現(xiàn)方法詳解
在介紹List接口之前,我們先來看看 Collection 接口,因為Collection接口是 List / Set / Queue 接口的父接口,List / Set / Queue 的實現(xiàn)類中很多的操作方法其實還是調(diào)用Collection類定義的方法。
一、Collection接口
在Collection接口中,定義了如下的方法:

其中方法可以分為以下幾類:
數(shù)據(jù)操作類方法:add/addAll/remove/removeAll/clear/retainAll/iterator
判斷類方法:contains/containsAll/equals/hashcode/isEmpty/size
所有繼承 Collection 接口的集合都可以用 Collection 中的方法進行元素操作,而具體的集合類有根據(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ǔ)上拓展了一些方法,增加了一些自己獨有的方法,主要是增加了這樣的幾類方法:
1、在 add / remove / addAll 中增加了 index 參數(shù),使其可以在任意位置插入刪除
add(int index, E element) / addAll(int index, E element)
可以在特定位置插入刪除元素,而不只是插入集合末尾
remove(int index)
刪除集合中特定下標的元素(removeAll() 是移除集合所有元素,暫時沒有移除一個區(qū)間的元素的 API。但 ArrayList 類實現(xiàn)了,對應(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.刪除集合中特定下標的元素 remove(int index)
strList.remove(0);
printCol(strList); //3 4 5 6
//4.獲?。ǜ拢┨囟ㄎ恢蒙系脑?get(int index)
System.out.println("第一個元素:" + strList.get(0)); //第一個元素: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
//獲取特定元素下標 indexOf()
//5的下標是:2
System.out.println("5的下標是:" + strList.indexOf("5"));
//獲取元素最后一次出現(xiàn)的下標 lastIndexOf()
//5的下標是:2
System.out.println("5的下標是:" + strList.lastIndexOf("5"));
printCol(strList); //1 4 5 6
//獲取一個ListIterator對象 listIterator()
/*沒有前一個值 本對象是:1
前一個對象值:1 本對象是:4
前一個對象值:4 本對象是:5
前一個對象值:5 本對象是:6*/
System.out.println("======================================");
ListIterator<String> it = strList.listIterator();
while(it.hasNext()){
if(it.hasPrevious()){
System.out.print("前一個對象值:" + it.previous());
it.next();
}else{
System.out.print("沒有前一個值");
}
System.out.print(" 本對象是:" + it.next() + "\n");
}
System.out.println("======================================");
//獲取一個ListIterator對象 listIterator(int index)
/*
* 前一個對象值:1 本對象是:4
前一個對象值:4 本對象是:5
前一個對象值:5 本對象是:6
*/
it = strList.listIterator(1); //從第一個開始迭代遍歷
while(it.hasNext()){
if(it.hasPrevious()){
System.out.print("前一個對象值:" + it.previous());
it.next();
}else{
System.out.print("沒有前一個值");
}
System.out.print(" 本對象是:" + 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)
可以獲?。ㄔO(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("第一個元素:" + strList.get(0)); //第一個元素: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) 獲取特定元素下標
- listIterator() / listIterator(int index) 獲取一個ListIterator對象(ListIterator對象具有比Iterator更強大的遍歷集合功能。Iterator只能向后遍歷,但ListIterator擴展了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.獲取特定元素下標 indexOf()
System.out.println("5的下標是:" + strList.indexOf("5")); //2
//7.獲取元素最后一次出現(xiàn)的下標 lastIndexOf()
System.out.println("5的下標是:" + strList.lastIndexOf("5")); //2
printCol(strList); //1 4 5 6
//8.獲取一個ListIterator對象 listIterator()
/*沒有前一個值 本對象是:1
前一個對象值:1 本對象是:4
前一個對象值:4 本對象是:5
前一個對象值:5 本對象是:6*/
System.out.println("======================================");
ListIterator<String> it = strList.listIterator();
while(it.hasNext()){
if(it.hasPrevious()){
System.out.print("前一個對象值:" + it.previous());
it.next();
}else{
System.out.print("沒有前一個值");
}
System.out.print(" 本對象是:" + it.next() + "\n");
}
System.out.println("======================================");
//9.獲取一個ListIterator對象 listIterator(int index)
/*
* 前一個對象值:1 本對象是:4
前一個對象值:4 本對象是:5
前一個對象值:5 本對象是:6
*/
it = strList.listIterator(1); //從第一個開始迭代遍歷
while(it.hasNext()){
if(it.hasPrevious()){
System.out.print("前一個對象值:" + it.previous());
it.next();
}else{
System.out.print("沒有前一個值");
}
System.out.print(" 本對象是:" + 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實現(xiàn)類

在ArayList實現(xiàn)類中,我們通常用Collection接口提供的add/addAll/remove/removeAll/iterator方法進行數(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實現(xiàn)類比起List接口,ArrayList實現(xiàn)類擁有了以下幾個特有的方法:
- clone() 復(fù)制一個集合實例
- removeRange(int fromIndex, int toIndex) 移除指定范圍內(nèi)的元素
- ensureCapacity(int minCapacity) 擴大集合大小,使其至少容納minCpacity個元素
- 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.擴大集合大小
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)造一個類,然后用這個類去調(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實現(xiàn)類

LinkedList同樣實現(xiàn)了Collection和List接口,所以同樣可以用這兩個接口中的方法進行數(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() + " ");
}
}
}
但其實LinkedList類也實現(xiàn)了DQueue接口,所以LinkedList也可以使用push/pop等方法進行堆棧結(jié)構(gòu)的操作,但這不屬于Collection和List的范圍,因此我們將在Queue接口時進行介紹。
五、Vector實現(xiàn)類

Vector實現(xiàn)類與ArrayList實現(xiàn)類的區(qū)別就是Vector是線程安全的,而ArrayList是線程不安全的,因此Vector效率較低。因此在非多線程的情況下推薦用ArrayList,而在多線程環(huán)境下適合用Vector。
一般操作Vector時也是使用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實現(xiàn)類

Stack類是Vector類的子類,因此它也可以用Collection和List接口提供的add/remove等方法。
Stack類是堆棧結(jié)構(gòu)的一個模擬,實現(xià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安全驗證過程
這篇文章主要為大家介紹了Spring?Boot在Web應(yīng)用中基于JdbcRealm安全驗證過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪<BR>2023-02-02
SpringBoot如何根據(jù)目錄路徑生成接口的url路徑
這篇文章主要介紹了SpringBoot如何根據(jù)目錄路徑生成接口的url路徑,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-11-11
springboot使用Mybatis-plus分頁插件的案例詳解
這篇文章主要介紹了springboot使用Mybatis-plus分頁插件的相關(guān)知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-05-05
Gradle下如何搭建SpringCloud分布式環(huán)境
這篇文章主要介紹了Gradle下如何搭建SpringCloud分布式環(huán)境問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2025-05-05
基于Flyway實現(xiàn)簡化Spring Boot項目部署
這篇文章主要介紹了基于Flyway實現(xiàn)簡化Spring Boot項目部署,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06
Java實現(xiàn)優(yōu)先隊列式廣度優(yōu)先搜索算法的示例代碼
這篇文章主要為大家詳細介紹了Java如何實現(xiàn)優(yōu)先隊列式廣度優(yōu)先搜索算法,文中通過一個示例帶大家具體了解了實現(xiàn)的方法,需要的可以參考一下2022-08-08
tk.mybatis實現(xiàn)uuid主鍵生成的示例代碼
本文主要介紹了tk.mybatis實現(xiàn)uuid主鍵生成的示例代碼,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-12-12

