集合框架中的List接口以及它的子類

List接口常用的子類
ArrayList
Vector
LiinkedList

概述

開發中,List接口的使用達到collection接口的80%。集合處理時,優先考慮List接口。
倆個擴充方法

方法名稱 描述
public E get(int index) 根據索引取得保存數據
public E set(int index,E element) 修改數據

List下常用的三個子類

一、ArrayList

ArrayList接口中要保存自定義對象,必須在自定義類中覆寫equals()。因爲contains()、remove()等方法必須調用equals()來查看是否相等。
1.ArrayList底層是一個對象數組。
2.ArrayList採用懶加載策略,只有當第一次使用添加元素纔會初始化數組大小,數組不夠用時,擴大爲原來1.5倍。
3.ArrayList對集合的增刪查改都採用異步處理,性能較高,非線程安全。

4.使用

public class ArrayL {
    public static void main(String[] args) {
        List<String> list = new ArrayList<>();
        list.add("ok");
        list.add("yes");
        list.add("yes");
        list.add("good");
        System.out.println(list);
        System.out.println( list.get(2));
        list.set(2,"newYes");
        System.out.println(list);
    }
}

運行結果:
在這裏插入圖片描述

5.查看自定義類的使用
package jihe;

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

class Person{
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public boolean equals(Object o){
        if(o == this)
            return true;
        if(o==null || this.getClass() != o.getClass()){
            return false;
        }
        Person per = (Person)o;
        return name.equals(per.name) && age == per.age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

public class ArrayL {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<>();
        list.add(new Person("zhangsan",8));
        list.add(new Person("lisi",7));
        list.add(new Person("wangwu",8));
        System.out.println(list);
        System.out.println(list.get(1));
        list.remove(new Person("lisi",7));
        System.out.println(list);
        }
}

運行結果
在這裏插入圖片描述

Vector

1.底層實現是一個對象數組,聲明一個Vector對象時,初始化對象數組長度爲10
2.Vector對集合的修改都採用同步處理(直接在方法上使用內建鎖Synchornized),性能較低,線程安全。
3.當數組長度不夠用時,擴容策略是變爲原來數組的2倍
4.使用

List<String> list = new Vector<>();

LinkedList

1.LinkedList底層封裝的是一個鏈表。
2.使用:

List<String> list = new LinkedList<>();

經典面試題

1.ArrayList與Vector區別
ArrayList Vector
歷史時期 JDK1.2 JDK1.0
性能 異步處理,性能較高 同步處理,性能較低
安全性 非線程安全 線程安全
初始化及擴容 懶加載策略,第一次添加元素才初始化大小,不夠用擴爲原來的1.5倍 初始化大小爲10,不夠用擴容爲原來2倍
輸出方式 Iterator、ListIterator、foreach Iterator、ListIterator、Enumeration
2.ArrayList和LinkedList區別
ArrayList LinkedList
數據結構 動態數組 鏈表
隨機查找效率 效率高 效率低,線性的存儲方式,需要從前往後依次尋找
(非首位)增加刪除效率 效率低,因爲得移動數組下標 效率高
時間複雜度 O(1) O(n)
場景 頻繁讀取集合中元素 增刪操作較多
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章