第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)