Java ArrayList和LinkedList

2022-07-05 09:00:31

集合的概念

​ 集合就是用於儲存多個資料的容器。相對於具有相同功能的陣列來說,集合的長度可變會更加靈活方便。Java中提供了使用不同資料結構儲存資料的不同集合類,他們有各自不同的特點,並且在類中提供了很多常用了方法,便於我們使用。

集合體繫結構

​ 集合主要有兩個頂層介面,Collection和Map。

集合體系圖

常用list集合

list集合的特點

​ List介面下的集合都會有以下特點:

  • 有索引
  • 可以儲存重複元素
  • 元素存入的順序和實際儲存的順序相同

ArrayList

建立物件

ArrayList list = new ArrayList<>();//不限定集合中存放元素的資料型別
ArrayList<集合元素的資料型別> list2 = new ArrayList<>();//限定集合中存放元素的資料型別

常用方法

方法 解釋
boolean add(E e) 新增元素,直接新增到集合的末尾 返回值代表是否新增成功
void add(int index, E element) 往指定索引位置新增元素
boolean remove(Object o) 刪除元素
E remove(int index) 刪除指定索引位置的元素,返回值是被刪除的元素
E set(int index, E element) 修改指定索引位置的元素 返回值為修改之前的元素值
E get(int index) 獲取指定索引位置的元素 返回值為對應的元素
int size() 獲取集合中元素的個數
boolean contains(Object o) 判斷集合中是否存在某個元素 ,返回值代表是否存在

我們平時對集合用的最多的是add,remove,get,set,size這幾個方法。

遍歷

1.使用索引遍歷

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("愚");
        list.add("生");
        list.add("淺");
        list.add("末");
        for (int i = 0; i < list.size(); i++) {
            System.out.println(list.get(i));
        }
    }

結果:

2.使用迭代器遍歷

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("愚");
        list.add("生");
        list.add("淺");
        list.add("末");
        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String s = it.next();
            System.out.println(s);
        }
    }

結果:

注意
為了避免並行修改異常(ConcurrentModificationException)的出現。避免在使用迭代器遍歷的過程中對集合進行操作。

3.使用foreach遍歷

​ foreach是java提供的一個語法。可以讓我們更方便的遍歷集合或陣列。

格式如下:

	for(元素資料型別 變數名 : 遍歷的集合或者陣列){
        //遍歷的時候會把遍歷到的元素賦值給我們上面定義的變數
    }

例如:

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("愚");
        list.add("生");
        list.add("淺");
        list.add("末");
        for (String s : list) {
            System.out.println(s);
        }
    }

結果:

    public static void main(String[] args) {
        String[] arr = { "愚", "生", "淺", "末" };
        for (String s : arr) {
            System.out.println(s);
        }
    }

結果:

4.轉換為陣列遍歷

    public static void main(String[] args) {
        ArrayList<String> list = new ArrayList<>();
        list.add("愚");
        list.add("生");
        list.add("淺");
        list.add("末");

        // 把list集合轉換為陣列 參數列 返回值型別 []
        Object[] objects = list.toArray();

        // 遍歷陣列
        for (int i = 0; i < objects.length; i++) {
            System.out.println(objects[i]);
        }
    }

結果:

LinkedList

建立物件

LinkedList list = new LinkedList<>();//不限定集合中存放元素的資料型別
LinkedList<集合元素的資料型別> list2 = new LinkedList<>();//限定集合中存放元素的資料型別

常用方法

方法 解釋
boolean add(E e) 新增元素,直接新增到集合的末尾 返回值代表是否新增成功
void add(int index, E element) 往指定索引位置新增元素
boolean remove(Object o) 刪除元素
E remove(int index) 刪除指定索引位置的元素,返回值是被刪除的元素
E set(int index, E element) 修改指定索引位置的元素 返回值為修改之前的元素值
E get(int index) 獲取指定索引位置的元素 返回值為對應的元素
int size() 獲取集合中元素的個數
boolean contains(Object o) 判斷集合中是否存在某個元素 ,返回值代表是否存在
 public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        //新增元素
        list.add("生");
        list.add(0,"愚");
        //刪除元素
        list.remove("生");
        //修改元素
        list.set(0,"愚生淺末");
        //獲取元素
        String s = list.get(0);
        //獲取集合大小
        int size = list.size();
        //判斷元素是否存在
        boolean flag = list.contains("愚生淺末");
    }

我們發現上面這些方法其實和ArrayList中的常用方法都是相同的。因為LinkedList和ArrayList都是List介面的實現類,上面的很多方法都是他們共同的介面中定義的方法,所以都會有。

下面是LinkedList的一些特有方法:

方法 解釋
void addFirst(E e) 把元素新增到集合的最前面
void addLast(E e) 把元素新增到集合的最後面
E removeFirst() 刪除集合最前面的一個元素,返回值代表被刪除的元素
E removeLast() 刪除集合最後面的一個元素,返回值代表被刪除的元素
    public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("愚");
        list.add("生");
        list.add("淺");
        list.add("末");
        list.addFirst("愷");
        list.addLast("龍");
        String s = list.removeFirst();
        System.out.println(s);
        String s1 = list.removeLast();
        System.out.println(s1);
    }

結果:

遍歷

​ 同ArrayList。

public static void main(String[] args) {
        LinkedList<String> list = new LinkedList<>();
        list.add("愚");
        list.add("生");
        list.add("淺");
        list.add("末");
        //遍歷集合
        //for迴圈遍歷
//        for (int i = 0; i < list.size(); i++) {
//            System.out.println(list.get(i));
//        }

        //迭代器
//        Iterator<String> it = list.iterator();
//        while (it.hasNext()){
//            String s = it.next();
//            System.out.println(s);
//        }

        //foreach
//        for(String s : list){
//            System.out.println(s);
//        }

        //轉換為陣列遍歷
        String[] strings = list.toArray(new String[0]);
        for (int i = 0; i < strings.length; i++) {
            System.out.println(strings[i]);
        }
    }

ArrayList和LinkedList的區別

​ 都是實現了List介面,不同點是底層儲存資料的資料結構不同。ArrayList底層是用陣列來儲存,而LinkedList是連結串列。所以各自的特點也和資料結構的特點一樣。

ArrayList : 查詢快,增刪慢

LinkedList: 增刪快,查詢慢

如圖片失效等情況,請參閱公眾號文章:https://mp.weixin.qq.com/s/JUMkP9T7scZulZmrOhRm2w
歡迎關注公眾號:愚生淺末,一起學習交流。