java集合框架————List接口

1.List接口概述

在實際開發之中,List接口的使用頻率可以達到Collection系列的80%。在進行集合處理的時候,優先考慮List接口。

首先來觀察List接口中提供的方法,在這個接口中有兩個重要的擴充方法 :
在這裏插入圖片描述

List子接口與Collection接口相比最大的特點在於其有一個get()方法,可以根據索引取得內容。由於List本身還是接口,要想取得接口的實例化對象,就必須有子類,在List接口下有三個常用子類:ArrayList、Vector、LinkedList。

在這裏插入圖片描述

最終的操作還是以接口爲主,所以所有的方法只參考接口中定義的方法即可。

2. ArrayList子類(優先考慮)

ArrayList是一個針對於List接口的數組實現。下面首先利用ArrayList進行List的基本操作。

範例:觀察List基本處理。

import java.util.ArrayList;
import java.util.List;
public class TestDemo {
    public static void main(String[] args) {
        // 此時集合裏面只保存String類型
        List<String> list = new ArrayList<>() ;
        list.add("Hello") ;
        // 重複數據
        list.add("Hello") ;
        list.add("Bit") ;
        System.out.println(list) ;
       }
 }

通過上述代碼我們可以發現,List允許保存重複數據。

範例:觀察其他操作

import java.util.ArrayList;
import java.util.List;

public class TestDemo {
    public static void main(String[] args) {
        // 此時集合裏面只保存String類型
        List<String> list = new ArrayList<>() ;
        System.out.println(list.size()+"、" + list.isEmpty());
        list.add("Hello") ;
        // 重複數據
        list.add("Hello") ;
        list.add("Bit") ;
        System.out.println(list.size()+"、" + list.isEmpty());
        System.out.println(list) ;
        System.out.println(list.remove("Hello")) ;
        System.out.println(list.contains("ABC")) ;
        System.out.println(list.contains("Bit")) ;
        System.out.println(list);
}
}

List本身有一個好的支持:存在get()方法,可以利用get()方法結合索引取得數據。

範例:List的get()操作

import java.util.ArrayList;
import java.util.List;

public class TestDemo {
    public static void main(String[] args) {
        // 此時集合裏面只保存String類型
        List<String> list = new ArrayList<>() ;
        list.add("Hello") ;
        // 重複數據
        list.add("Hello") ;
        list.add("Bit") ;
        for (int i = 0; i < list.size() ; i++) {
        System.out.println(list.get(i)) ; }
    }
}

get()方法是List子接口提供的。如果現在操作的是Collection接口,那麼對於此時的數據取出只能夠將集合變爲對象數組操作。

範例:通過Collection進行輸出處理。

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;

public class TestDemo {
    public static void main(String[] args) {
        // 此時集合裏面只保存String類型
        Collection<String> list = new ArrayList<>() ;
        list.add("Hello") ;
        // 重複數據
        list.add("Hello") ;
        list.add("Bit") ;
        // 操作以Object爲主,有可能需要向下轉型,就有可能產生ClassCastException
        Object[] result = list.toArray() ;
        System.out.println(Arrays.toString(result)) ;
    }
}

開發中儘量不要使用Collection接口

3.集合與簡單Java類

在以後的實際開發中,集合裏面保存最多的數據類型,就是簡單Java類。

範例:向集合保存簡單Java類對象。

在這裏插入圖片描述

在這裏插入圖片描述

集合操作簡單java類時,對於remove()、contains()方法需要equals()方法支持。

4.舊的子類(Vector) 使用較少

Vector是從JDK1.0提出的,而ArrayList是從JDK1.2提出的。

範例:使用Vector

import java.util.List;
import java.util.Vector;

public class TestDemo {
    public static void main(String[] args) {
        List<String> list = new Vector<>() ;
        list.add("hello") ;
        list.add("hello") ;
        list.add("bit") ;
        System.out.println(list) ;
        list.remove("hello") ;
        System.out.println(list) ;
    }
}

面試題:請解釋ArrayList與Vector區別

  1. 歷史時間:ArrayList是從JDK1.2提供的,而Vector是從JDK1.0就提供了。
  2. 處理形式:ArrayList是異步處理,性能更高;Vector是同步處理,性能較低。
  3. 數據安全:ArrayList是非線程安全;Vector是性能安全。
  4. 輸出形式:ArrayList支持Iterator、ListIterator、foreach;Vector支持Iterator、ListIterator、foreach、Enumeration。

在以後使用的時候優先考慮ArrayList,因爲其性能更高,實際開發時很多時候也是每個線程擁有自己獨立的集合資源。如果需要考慮同步也可以使用concurrent包提供的工具將ArrayList變爲線程安全的集合。

5.LinkedList子類

在List接口中還有一個LinkedList子類,這個子類如果向父接口轉型的話,使用形式與之前沒有任何區別。

範例:使用LinkedList

import java.util.LinkedList;
import java.util.List;

public class TestDemo {
    public static void main(String[] args) {
        List<String> list = new LinkedList<>() ;
        list.add("hello") ;
        list.add("hello") ;
        list.add("bit") ;
        System.out.println(list) ;
        list.remove("hello") ;
        System.out.println(list) ;
    }
}

面試題:請解釋ArrayList與LinkedList區別

  1. 觀察ArrayList源碼,可以發現ArrayList裏面存放的是一個數組,如果實例化此類對象時傳入了數組大
    小,則裏面保存的數組就會開闢一個定長的數組,但是後面再進行數據保存的時候發現數組個數不夠了
    會進行數組動態擴充。 所以在實際開發之中,使用ArrayList最好的做法就是設置初始化大小。
  2. LinkedList:是一個純粹的鏈表實現,與之前編寫的鏈表程序的實現基本一樣。

總結:ArrayList封裝的是數組;LinkedList封裝的是鏈表。ArrayList時間複雜度爲1,而LinkedList的複雜度爲n。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章