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

Java集合操作之List接口及其實(shí)現(xiàn)方法詳解

 更新時(shí)間:2020年04月23日 14:51:39   作者:陳樹義  
這篇文章主要介紹了Java集合操作之List接口及其實(shí)現(xiàn)方法,詳細(xì)分析了Java集合操作中List接口原理、功能、用法及操作注意事項(xiàng),需要的朋友可以參考下

在介紹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)文章

最新評(píng)論