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) |
場景 | 頻繁讀取集合中元素 | 增刪操作較多 |