天天看點

Java學習路線-35:List集合第29 章 : List集合

第29 章 : List集合

125 List接口簡介

允許儲存重複資料

List新的方法

E get(int index);
E set(int index, E element);
ListIterator<E> listIterator();      

三個常用子類

ArrayList  90%
Vector     8%
LinkedList 2%       

定義

public class ArrayList<E> 
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

public class LinkedList<E>
    extends AbstractSequentialList<E>
    implements List<E>, Deque<E>, Cloneable, java.io.Serializable
      

126 ArrayList子類

繼承結構

@Iterable
    -@Collection
        -@List


AbstractCollection(Collection)
    - AbstractList(List)
        -ArrayList(List, RandomAccess, Cloneable, java.io.Serializable)      

List特征

1、儲存順序就是存儲順序

2、允許有重複資料

JDK >= 1.8 Iterable接口中有forEach方法

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

class Demo{
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("Hello");
        list.add("Hello");
        list.add("World");
        System.out.println(list);
        // [Hello, Hello, World]

        list.forEach((str)->{
            System.out.println(str);
        });
        /**
         * Hello
         * Hello
         * World
         */
        System.out.println(list.size());  // 3
        System.out.println(list.isEmpty());  // false
    }
}      

ArrayList 實際包含一個對象數組

預設使用空數組

添加新元素時,如果長度不夠,會開辟一個新的數組

版本不一樣實作也不一樣

JDK < 1.9 預設使用長度為10的數組

JDK >= 1.9 預設空數組

如果超過10個資料,考慮使用有參構造,避免垃圾數組的産生

127 ArrayList儲存自定義類對象

如果需要remove,contains方法,要覆寫equals方法

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;
    }

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

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (obj == this) {
            return true;
        }
        if (!(obj instanceof Person)) {
            return false;
        }
        Person other = (Person) obj;

        return this.name.equals(other.name) && this.age == other.age;

    }

}

class Demo {
    public static void main(String[] args) {
        List<Person> list = new ArrayList<Person>();
        list.add(new Person("Tom", 23));
        list.add(new Person("Jack", 24));
        list.add(new Person("Steve", 25));

        System.out.println(list.contains(new Person("Tom", 23)));
        // true
    }
}      

128 LinkedList子類

繼承關系

@Iterable
    -@Collection
        -@List

AbstractCollection(Collection)
    -AbstractList(List)
        -AbstractSequentialList
            -LinkedList(List, Deque, Cloneable, java.io.Serializable)      

代碼執行個體

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

class Demo{
    public static void main(String[] args) {
        List<String> list = new LinkedList<String>();
        list.add("Hello");
        list.add("Hello");
        list.add("World");
        System.out.println(list);
        // [Hello, Hello, World]

        list.forEach(System.out::println);
        /**
         * Hello
         * Hello
         * World
         */
    }
}      

LinkedList和ArrayList接口一緻,實作不一樣

差別:

ArrayList   數組實作 get查找複雜度為O(1) 
LinkedList  連結清單實作 get查找複雜度為O(n)      

ArrayList預設初始化大小為10,長度會自動擴容,儲存大資料會産生垃圾,這時使用LinkedList

129 Vector子類

Vector和ArrayList繼承關系一緻

Vector 的方法加了同步處理synchronized ,多線程安全,性能不如ArrayList

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

class Demo{
    public static void main(String[] args) {
        List<String> list = new Vector<String>();
        list.add("Hello");
        list.add("Hello");
        list.add("World");
        System.out.println(list);
        // [Hello, Hello, World]

        list.forEach(System.out::println);
        /**
         * Hello
         * Hello
         * World
         */
    }
}      

總結

集合 說明
ArrayList 數組實作,讀>寫
Vector 數組實作,線程安全
LinkedList 連結清單實作,寫>讀
@Iterable
    -@Collection
        -@List


AbstractCollection(Collection)
    - AbstractList(List)
        -ArrayList(List, RandomAccess, Cloneable, java.io.Serializable)
        -Vector(List, RandomAccess, Cloneable, java.io.Serializable)
        -AbstractSequentialList
            -LinkedList(List, Deque, Cloneable, java.io.Serializable)