集合(List)
文章目錄
一、簡介
1.Java集合框架的由來
其實在Java2(jdk1.2)之前,Java是沒有完整的集合框架的。它只有一些簡單的可以自擴展的容器類,比如Vector,Stack,Hashtable等。 爲什麼存在容器類: 容器類(集合類)可以存儲多個數據,既然數組可以存儲多個數據,爲什麼需要定義容器類.
2.數組的弊端
1): 長度是不可變的,一旦數組初始化之後,長度是固定的.
2): 在N個地方需要存儲多個數據,都得專門去編寫數組的操作方法,如此以來,沒有體現DRY原則. 代碼和功能重複-------->封裝思想.
3): 即使每一個人都要使用到數組類,但是不同的人定義的類名和方法名是不同的,實現細節也是參差不齊的. SUN公司就自己定義好了容器類,每一個開發者只管調用即可.
在集合框架這個章節: 拿來主義.
3.什麼是集合框架
儘管這些容器類非常好用,但是卻不能集中和統一管理。集合框架是爲表示和操作集合而規定的一種統一的標準的體系結構。任何集合框架都包含三大塊內容:對外的接口、接口的實現和對集合運算的算法(底層都對應着某一種數據結構的算法)。
4.爲什麼需要集合框架
(把集合框架的類和接口都存放在java.util包中):
1):提供功能的複用(java.util包).
2):讓程序工作者專注於業務開發,而不是數據結構和算法.
5.常用的框架接口規範
集合中存儲的對象,稱之爲集合元素.
6.常用的集合類
Set(集):集合中的對象不按特定方式排序,不允許元素重複.
List(列表):集合中的對象按照索引位置排序,允許元素重複.
Map(映射):集合中每一個元素都包含一對key和value對象.不允許key對象重複,值對象可以重複.
二、List實現類性能和特點分析
1.List接口
- 重複性:數據可以重複
- null值:可以有null存在
- 有序性:保證數據的插入有序
2.面向接口編程
接口類型 變量 = new 實現類();List list = new ArrayList();
3.ArrayList與LinkedList的特點(及源碼探究)
ArrayList
特點:
重複性:數據可以重複
有序性:能保證數據的插入有序
null值:可以有 null值存在
LinkedList:
特點:
重複性:可以重複存儲數據
有序性:數據按照插入有序
null值:可以存儲null值
ArrayList源碼探究:
1.繼承關係
2.底層數據結構
3.基本屬性(包括“默認值”)
4.構造函數
5.增長方式
//1.繼承關係
public class ArrayList<E> extends AbstractList<E>
implements List<E>, RandomAccess, Cloneable, java.io.Serializable
ArrayList繼承AbstractList,父類中對部分接口進行實現
實現了List接口提供的方法,Serializable說明該類能夠被序列化 ,能夠被克隆、序列化
//2.底層數據結構
ArrayList底層數據結構是"數組"
//3.基本屬性
private static final int DEFAULT_CAPACITY = 10;
默認容量大小
private static final Object[] EMPTY_ELEMENTDATA = {};
默認數組大小
private transient Object[] elementData;
存儲元素的數組
private int size;
集合存儲元素的個數
//4.構造函數
public ArrayList(int initialCapacity) {
super();
//指定大小不合法,則直接拋出異常
初始化數組大小
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
this.elementData = new Object[initialCapacity];
}
//有參構造,指定集合初始化大小
public ArrayList() {
super();
this.elementData = EMPTY_ELEMENTDATA;
}
//無參構造
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
//有參構造,通過集合來創建新的集合
//5.增長方式
按照原數組的1.5倍進行擴容
LinkedList源碼探究:
1.繼承關係
2.底層數據結構
3.基本屬性(包括“默認值”)
4.構造函數
5.增長方式
//1.繼承關係
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable
extends AbstractSequentialList<E>對List接口的實現
implements Deque<E> 具有隊列的特徵:先進先出
提供了特殊的方法,從頭、從尾進行添加、刪除、獲取
//2.底層數據結構
底層數據結構是“雙向鏈表”
//3.基本屬性(包括“默認值”,無默認值)
屬性:
transient int size = 0; 集合中元素個數
transient Node<E> first; 頭結點
transient Node<E> last; 尾結點
private static class Node<E> {
E item; 存儲元素
Node<E> next; 後繼節點
Node<E> prev; 前驅節點
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
//4.構造函數
構造函數
public LinkedList() {
}
public LinkedList(Collection<? extends E> c) {
this();
addAll(c);
}
//5.增長方式
LinkedList提供頭插,尾插方式插入節點、默認採用的是尾插
4.ArrayList與LinkedList的相同點和不同點
ArrayList、LinkedList的異同點,各自優勢(應用場景)
相同點:
- 繼承關係:List接口下的實現類,具有list提供的所有方法
- 有序性:數據都是按照插入有序
- 重複性:集合中元素是可以重複的
- null值:都可以存儲 null值
- 安全性:都是非線程安全的集合
不同點:
- 數據結構:ArrayList底層是數組、LinkedList底層是鏈表(雙向鏈表)
- 特有方法:LinkedList具有特有的方法,列如:addFirst、addLast。(實現Deque接口)
- 效率:ArrayList查詢效率高O(1)、LinkedList添加o(1)、刪除效率高->ArrayList添加元素趨近於O(1)\在不擴容情況下就是O(1)
使用的選擇:
- 如果刪除和插入操作頻繁,應該選擇LinkedList類.
- 如果查詢操作頻繁,應該使用ArrayList類.
ArrayList和數組有什麼區別?
-
初始化大小:ArrayList可以不指定大小,數組必須制定大小
-
存儲數據類型:ArrayList只能存儲引用類型,數組可以存儲引用類型和基本類型
2019.2.23/週六 by 922