一、List集合概述
java.util.List
接口繼承自Collection接口,是單列集合的一個(gè)重要分支,習(xí)慣性地會(huì)將實(shí)現(xiàn)了List接口的對(duì)象稱為List集合,在List集合中允許出現(xiàn)重復(fù)的元素,所有的元素是以一種線性方式進(jìn)行存儲(chǔ)的,在程序中可以通過索引來訪問集合中的指定元素,另外List集合還有一個(gè)特點(diǎn)就是元素有序,即元素的存入順序和取出順序一致
List特性:
- 有序
- 存取有順序
- 有下標(biāo)
- 是一個(gè)帶有索引的集合,通過索引就可以精確的操作集合中的元素(與數(shù)組的索引一個(gè)道理)
- 可以重復(fù)
- 添加的元素可以重復(fù)
List實(shí)現(xiàn)類架構(gòu)圖、
二、ArrayList
1、什么是ArrayList類
java.util.ArrayList
是大小可變的數(shù)組的實(shí)現(xiàn),是單列集合List的實(shí)現(xiàn)類,存儲(chǔ)在內(nèi)的數(shù)據(jù)稱為元素,此類提供一些方法來操作內(nèi)部存儲(chǔ)的元素,ArrayList中可不斷添加元素,其大小也自動(dòng)增長java.util.ArrayList
集合數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)是數(shù)組結(jié)構(gòu),元素增刪慢,查找快,由于日常開發(fā)中使用最多的功能為查詢數(shù)據(jù)、遍歷數(shù)據(jù),所以ArrayList是常用的集合。
2、ArrayList常用方法
方法 | 說明 |
---|---|
add(E e) | 把指定的元素添加到集合中 |
set(int index , E e) | 根據(jù)下標(biāo)替換對(duì)象 |
subList(int fromIndex , int toIndex) | 截取 |
toArray() toArray(T[]) |
集合轉(zhuǎn)換數(shù)組 |
contains(E e) | 判斷集合中是否包含指定的元素 |
get(int index) | 根據(jù)下標(biāo)獲取對(duì)應(yīng)的元素 |
indexOf(E e) | 獲取指定的元素在集合中第一次出現(xiàn)的索引 -1【未找到】 |
isEmpty() | 判斷集合是否為空 |
size() | 獲取集合的長度 |
clear() | 清空集合 |
remove(int index) | 根本下標(biāo)刪除元素 |
代碼案例:
package cn.com.example11;
import java.util.ArrayList;
import java.util.List;
public class ArrayListClass {
static ArrayList arrayList;
static {
arrayList = new ArrayList();
arrayList.add(1);
arrayList.add(2);
arrayList.add(3);
arrayList.add(4);
}
/**
* 添加元素
*/
public static void addHandler(){
arrayList.add(1);
arrayList.add(2);
System.out.println(arrayList);
}
/**
* 根據(jù)下標(biāo)替換對(duì)象
*/
public static void setHandler(){
arrayList.set(1,"admin");
System.out.println(arrayList);
}
/**
* 截取
*/
public static void subListHandler(){
List list = arrayList.subList(1,3);
System.out.println(list);
System.out.println(arrayList);
}
/**
* 集合轉(zhuǎn)換數(shù)組
*/
public static void toArrayHandler(){
Object[] arr = arrayList.toArray();
System.out.println(arr[0]);
System.out.println(arrayList);
}
/**
* 判斷集合中是否包含指定的元素
*/
public static void containersHandler(){
boolean b = arrayList.contains("admin");
System.out.println(b);
System.out.println(arrayList);
}
/**
* 根據(jù)下標(biāo)獲取對(duì)應(yīng)的元素
*/
public static void getHandler(){
String value = (String)arrayList.get(1);
System.out.println(value);
System.out.println(arrayList);
}
/**
* 獲取指定的元素在集合中第一次出現(xiàn)的索引
*/
public static void indexOfHandler(){
int index = arrayList.indexOf("admin");
System.out.println(index);
System.out.println(arrayList);
}
/**
* 判斷集合是否為空
*/
public static void isEmptyHandler(){
boolean b = arrayList.isEmpty();
System.out.println(b);
System.out.println(arrayList);
}
/**
* 獲取集合長度
*/
public static void sizeHandler(){
int count = arrayList.size();
System.out.println(count);
System.out.println(arrayList);
}
/**
* 根據(jù)下標(biāo)刪除元素
*/
public static void removeHandler(){
String value = (String) arrayList.remove(1);
System.out.println(value);
System.out.println(arrayList);
}
/**
* 清空集合
*/
public static void clearHandler(){
arrayList.clear();
System.out.println(arrayList);
}
public static void main(String[] args) {
addHandler();
setHandler();
subListHandler();
toArrayHandler();
containersHandler();
getHandler();
indexOfHandler();
isEmptyHandler();
sizeHandler();
removeHandler();
clearHandler();
}
}
運(yùn)行結(jié)果:
3、ArrayList遍歷
3.1、普通for循環(huán)
代碼案例:
/**
* 普通for循環(huán)
*/
public static void forHandler(){
for (int i = 0; i < arrayList.size(); i++) {
System.out.println(arrayList.get(i));
}
}
3.2、增強(qiáng)for循環(huán)
代碼案例:
/**
* 增強(qiáng)for循環(huán)
*/
public static void forEachHandler(){
for (Object o : arrayList) {
System.out.println(o);
}
}
3.3、Iterator迭代器
代碼案例:
/**
* Iterator迭代器
*/
public static void iteratorHandler(){
Iterator iterator = arrayList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
4、ArrayList數(shù)據(jù)結(jié)構(gòu)
ArrayList數(shù)據(jù)結(jié)構(gòu):數(shù)組結(jié)構(gòu)
ArrayList查詢數(shù)據(jù)快,可根據(jù)下標(biāo)查詢,但是增刪速度慢,一旦在某個(gè)位置插入數(shù)據(jù),后面所有數(shù)據(jù)都必須往后移動(dòng)
三、LinkedList
java.util.LinkedList
集合數(shù)據(jù)存儲(chǔ)的結(jié)構(gòu)是鏈表結(jié)構(gòu),方便元素添加、刪除的集合。
LinkedList是一個(gè)雙向鏈表
1、LinkedList常用方法
方法 | 說明 |
---|---|
public void addFirst(E e) | 將指定元素插入集合的開頭 |
public void addLast(E e) | 將指定元素插入集合的結(jié)尾 |
public E getFirst() | 返回集合第一個(gè)元素 |
public E getLast() | 返回集合最后一個(gè)元素 |
public E removeFirst() | 移除并返回集合的第一個(gè)元素 |
public E removeLast() | 移除并返回最后一個(gè)元素 |
public E pop() | 從集合所表示的堆棧中彈出一個(gè)元素 |
public void push(E e) | 將元素推入集合所表示的堆棧中 |
public boolean isEmpty() | 判斷集合是否為空 |
代碼案例:
package cn.com.example11;
import java.util.LinkedList;
public class LinkedListClass {
public static LinkedList<Integer> linkedList;
static {
linkedList = new LinkedList<>();
linkedList.add(1);
linkedList.add(2);
linkedList.add(3);
linkedList.add(4);
}
/**
* 將指定元素插入集合的開頭
*/
public static void addFirstHandler(){
linkedList.addFirst(0);
System.out.println(linkedList); // [0, 1, 2, 3, 4]
}
/**
* 將指定元素插入集合的結(jié)尾
*/
public static void addLastHandler(){
linkedList.addLast(5);
System.out.println(linkedList); // [0, 1, 2, 3, 4, 5]
}
/**
* 返回集合第一個(gè)元素
*/
public static void getFirstHandler(){
Integer value = linkedList.getFirst();
System.out.println(value); // 0
}
/**
* 返回集合最后一個(gè)元素
*/
public static void getLastHandler(){
Integer value = linkedList.getLast();
System.out.println(value); // 5
}
/**
* 移除并返回集合的第一個(gè)元素
*/
public static void removeFirstHandler(){
Integer value = linkedList.removeFirst();
System.out.println(linkedList); // [1, 2, 3, 4, 5]
System.out.println(value); // 0
}
/**
* 移除并返回集合的最后一個(gè)元素
*/
public static void removeLastHandler(){
Integer value = linkedList.removeLast();
System.out.println(linkedList); // [1, 2, 3, 4]
System.out.println(value); // 5
}
/**
* 從集合所表示的堆棧中彈出一個(gè)元素
*/
public static void popHandler(){
Integer value = linkedList.pop();
System.out.println(linkedList); // [2, 3, 4]
System.out.println(value); // 2
}
/**
* 將元素推入集合所表示的堆棧中
*/
public static void pushHandler(){
linkedList.push(6);
System.out.println(linkedList); // [6, 2, 3, 4]
}
/**
* 判斷集合是否為空
*/
public static void isEmptyHandler(){
boolean b = linkedList.isEmpty();
System.out.println(b); // false
}
public static void main(String[] args) {
addFirstHandler();
addLastHandler();
getFirstHandler();
getLastHandler();
removeFirstHandler();
removeLastHandler();
popHandler();
pushHandler();
isEmptyHandler();
}
}
2、LinkedList遍歷
2.1、增強(qiáng)for循環(huán)
代碼案例:
/**
* 增強(qiáng)for循環(huán)
*/
public static void forEachHandler(){
for (Integer integer : linkedList) {
System.out.println(integer);
}
}
2.2、Iterator迭代器
代碼案例:
/**
* Iterator遍歷
*/
public static void iteratorHandler(){
Iterator<Integer> iterator = linkedList.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
3、LinkedList數(shù)據(jù)結(jié)構(gòu)
LinkedList數(shù)據(jù)結(jié)構(gòu):雙向鏈表
四、ArrayList和LinkedList區(qū)別
1、ArrayList和LinkedList結(jié)構(gòu)不同
ArrayList和LinkedList都是集合類,但是他們有兩種不同的實(shí)現(xiàn)方式,ArrayList底層維護(hù)的是一個(gè)動(dòng)態(tài)數(shù)組,LinkedList底層維護(hù)的是一個(gè)雙向鏈表
ArrayList數(shù)據(jù)結(jié)構(gòu)
LinkedList數(shù)據(jù)結(jié)構(gòu)
2、效率不同
2.1、添加效率
ArrayList和LinkedList分別插入1000萬條數(shù)據(jù)測試
ArrayList插入1000萬條數(shù)據(jù)耗時(shí)420毫秒
LinkedList插入1000萬條數(shù)據(jù)耗時(shí)8900毫秒
ArrayList插入1000萬條數(shù)據(jù):
public static void addArrayList(){
long start = System.currentTimeMillis();
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 1; i <= 10000000 ; i++) {
arrayList.add(i);
}
long end = System.currentTimeMillis();
System.out.println("耗時(shí):" + (end - start));
}
LinkedList插入1000萬條數(shù)據(jù):
public static void addLinkedList(){
long start = System.currentTimeMillis();
LinkedList<Integer> linkedList = new LinkedList<>();
for (int i = 1; i <= 10000000 ; i++) {
linkedList.add(i);
}
long end = System.currentTimeMillis();
System.out.println("耗時(shí):" + (end - start));
}
很明顯普通的插入數(shù)據(jù),ArrayList比LinkedList要快很多,可為什么普遍說法都是LinkedList添加刪除快,這里是有前提條件,LinkedList在兩種情況下插入數(shù)據(jù)比ArrayList快
a、往集合中間插入數(shù)據(jù)時(shí)ArrayList比LinkedList慢
ArrayList往集合中間插入數(shù)據(jù)要做兩個(gè)事:把之前的數(shù)據(jù)挪開賦值到新的數(shù)組位置,然后把需要插入的數(shù)據(jù)插入到數(shù)組對(duì)應(yīng)的位置。
LinkedList只要修改對(duì)應(yīng)位置數(shù)據(jù)prev和next對(duì)象的指向就可以了。
b、ArrayList正好擴(kuò)容的時(shí)候添加數(shù)據(jù)要比LinkedList慢
因?yàn)锳rrayList維護(hù)的是一個(gè)數(shù)組,所以當(dāng)容量到達(dá)閥值時(shí)就會(huì)進(jìn)行擴(kuò)容,然后會(huì)重新分配數(shù)據(jù)的位置,當(dāng)數(shù)組擴(kuò)容的時(shí)候速度也要比LinkedList慢。
2.2、刪除數(shù)據(jù)
ArrayList要比LinkedList慢,原理和往集合中間插入數(shù)據(jù)是一樣的,ArrayList每次刪除數(shù)據(jù)都要對(duì)數(shù)組重組。
2.3、查詢數(shù)據(jù)
ArrayList比LinkedList快。
原理是ArrayList是數(shù)組有下標(biāo)標(biāo)記數(shù)據(jù)位置,查詢時(shí)直接返回對(duì)應(yīng)數(shù)組下標(biāo)數(shù)據(jù)即可。
LinkedList是鏈表,沒有對(duì)數(shù)據(jù)進(jìn)行位置標(biāo)記,每次獲取固定位置的數(shù)據(jù)都需要循環(huán)遍歷鏈表和linkedList.get(10),就需要循環(huán)10次找到對(duì)應(yīng)的節(jié)點(diǎn)返回。
五、Vector
Vector類可以實(shí)現(xiàn)可增長的對(duì)象數(shù)組,和ArrayList差不多
VectorJDK1.0出現(xiàn)的,從JDK1.2開始對(duì)該類進(jìn)行改進(jìn),可以實(shí)現(xiàn)List接口,但是Vector是同步的,單線程,那么速度比較慢,所以被ArrayList替代文章來源:http://www.zghlxwxcb.cn/news/detail-549906.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-549906.html
到了這里,關(guān)于Java集合-List的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!