1.1List接口概述
List接口特征:
1.數(shù)據(jù)存儲可重復(fù)
2有序,添加順序和保存順序一致
----| ArrayList<E>
可變長數(shù)組
-----| LinkedList<E>
雙向鏈表
---------| Vector
線程安全的可變長數(shù)組
1.2List常用方法
增
boolean add(E? e)葫盼;
List接口繼承Collection接口 add方法契沫,使用操作和Collection一致,并且這里采用的添加方式是【尾插法】
boolean add(int index 捺檬,E? e)椅邓;
List接口【特有方法】,在指定位置砖茸,添加指定元素
boolean addAll(Collection<? extends E > c);
List接口繼承Collection接口 addAll方法殴穴,使用操作和Collection一致,并且這里采用的添加方式是【尾插法】
boolean addAll( int index 货葬,Collection<? extends E > c)采幌;
List 接口【特有方法】,指定下標(biāo)位置震桶,添加另一個集合中所有內(nèi)容
刪
E remove(int index)休傍;
List接口【特有·方法】,獲取指定下標(biāo)位置的元素
boolean remove (Object obj)蹲姐;
List 接口繼承Collection接口方法磨取,刪除集合中的指定元素
boolean removeAll(Collection<?> c);
List接口繼承Collection接口方法。刪除當(dāng)前集合中和參數(shù)集合重復(fù)元素
clear()柴墩;
List 接口繼承Collection幾口方法忙厌。清空整個集合中的所有元素
改
E set(int index,E e)江咳;
List接口【特有方法】逢净,使用指定元素替代指定下標(biāo)的元素,返回值是被替換的元素
查
int size ()歼指;
List 接口繼承Collection接口方法爹土。獲取集合中有效元素個數(shù)
boolean isEmpty();
List接口繼承Collection接口方法判斷當(dāng)前集合是否為空
boolean contains(Object obj)踩身;
List接口繼承Collection接口方法胀茵,判斷指定元素是否包含在當(dāng)前集合中
boolean containsAll(Collection<?> c);
List接口繼承Collection接口方法挟阻,判斷參數(shù)集合是不是在當(dāng)前集合的子集合
Object[] toArray()琼娘;
List接口繼承Collection接口方法呵哨。獲取當(dāng)前集合中所有元素Object數(shù)組
E get (int index);
List接口【特有方法】轨奄。獲取指定下標(biāo)對應(yīng)的元素
List<E> subList(intfromIndex孟害,int toIndex);
List接口【特有方法】挪拟。獲取當(dāng)前集合指定子集合挨务,從fromIndex開始到toIndex結(jié)束,
fromIndex <= 范圍 < toIndex
int indexOf(Object obj);
List接口【特有方法】玉组。獲取指定元素在集合中低依次出現(xiàn)的位置
int lastIndexOf(Object obj)谎柄;
List接口【特有方法】。獲取指定元素在集合中最后一次出現(xiàn)的位置
2.3List接口常用方法演示
package com.qfen.rxs;
import java.util.ArrayList;
import java.util.List;
public class Demo4 {
private void main() {
// TODO Auto-generated method stub
List<String> list = new ArrayList<String>();
list.add("wqe1");
list.add("121424");
list.add("wweqeq1");
list.add("1dad24");
System.out.println(list);
list.add(3, "1edqrdwf");
System.out.println(list);
List<String> list2 = new ArrayList<String>();
list2.add("1111");
list2.add("1211");
list2.add("1311");
list2.add("1411");
list.addAll(4,list);
System.out.println(list);
String remove = list.remove(1);
System.out.println(remove);
System.out.println(list);
list.removeIf((str) -> str.length() > 4);
System.out.println(list);
}
}
3ArrayList【重點】
3.1ArrayList概述
ArrayList是在java中集合非常重要的一個組裝惯雳,基于數(shù)組完成的數(shù)據(jù)結(jié)構(gòu)朝巫。課變長數(shù)組操作!J啊劈猿!
底層保存數(shù)據(jù)的是一個Object類型數(shù)組
ArrayList使用的方法都是List接口中的方法,有兩需要了解的成員方法
ensureCapacity()潮孽;
判斷方法用于確定當(dāng)前底層數(shù)組的容量是否滿足當(dāng)前操作需求
trimToSize()揪荣;
節(jié)省空間將底層數(shù)組的容量縮容致有效元素個數(shù)’
3.2細(xì)節(jié)問題
1. DEFAULT_CAPACITY 默認(rèn)容量 private static final int DEFAULT_CAPACITY = 10;
在調(diào)用ArrayList無參數(shù)構(gòu)造方法是,才會使用 DEFAULT_CAPACITY往史,作為底層Object數(shù)組的初始化容量仗颈。如果用 戶指定調(diào)用的是帶有初始化底層Object數(shù)組容量的構(gòu)造方法,會根 據(jù)用戶指定的容量創(chuàng)建對一個ArrayList集合椎例。
2為什么 - 8??? 因為在數(shù)組中存在很多屬性挨决,length只是眾多屬性中的一 個,在創(chuàng)建數(shù)組使用的過程中订歪,需要留有內(nèi)存空間用于保存數(shù)組中屬性脖祈。
3.3效率問題
ArrayList特征:
?增刪慢?
?增加慢?
?1. 數(shù)組當(dāng)前容量無法滿足添加操作,需要進行g(shù)row 擴容方法執(zhí)行陌粹,在擴容方 法中撒犀,存在數(shù)組創(chuàng)建,數(shù)組數(shù)據(jù)拷貝掏秩。非常浪費時 間或舞,而且浪費內(nèi)存。?
?2. 數(shù)組在添加數(shù)據(jù)的過程中蒙幻,存在在指定位置添加 元素映凳,從指定位置開始, 之后的元素整體向后移動邮破。?
刪除慢
?1. 刪除數(shù)據(jù)之后诈豌,從刪除位置開始仆救,之后的元素整 體向前移動,移動過程非 常浪費時間?
?2. 刪除操作會導(dǎo)致數(shù)據(jù)空間的浪費矫渔,內(nèi)存的浪費?
?查詢快
ArrayList底層是一個數(shù)組結(jié)構(gòu)彤蔽,在查詢操作的過程中, 是按照數(shù)組+下標(biāo)的方式 來操作對應(yīng)的元素庙洼,數(shù)組+下標(biāo)方式可以直接獲取對應(yīng)的空 間首地址顿痪,CPU訪問效率 極高
3.4【補充知識點,內(nèi)存地址】
內(nèi)存地址概念: [計算機原理] 計算機中為了更好的使用內(nèi)存油够,操作程序蚁袭,完成代碼。將內(nèi)存按 照小單位石咬,進行編號處理揩悄。 小單位: 字節(jié) byte 從編號為0內(nèi)存開始,到內(nèi)存的大值鬼悠。地址的展示方式是十六 進制删性。
3.5【補充 內(nèi)存地址對于cpu有什么關(guān)系】
快遞小哥我們可以看做是CPU,快遞上地址厦章,就是內(nèi)存地址镇匀,具 有唯一性!M嗫小!
代碼實際運行:? ? CPU就是根據(jù)內(nèi)存地址幸缕,可以直達(dá)內(nèi)存所在區(qū)域群发,執(zhí)行對應(yīng)代 碼。精準(zhǔn)而優(yōu)雅发乔,速度非呈旒耍快!栏尚!
3.6【補充 數(shù)組空間地址關(guān)系】
3.7【補充 null是什么】
null 是計算機中非常特殊的一塊內(nèi)存起愈。該內(nèi)存編號 0x0000 0000
該內(nèi)存受到系統(tǒng)保護? ?
?不只是電腦,包括手機译仗,iPad抬虽,智能設(shè)備,只要存在計算機基 本結(jié)構(gòu)的設(shè)備上都存在null 編號為0x0內(nèi)存纵菌。大小一個字節(jié)? ? 該內(nèi)存不能讀取任何數(shù)據(jù)阐污,也不能寫入任何數(shù)據(jù)。一旦操作咱圆,程 序直接被系統(tǒng)殺死? ?Kill -9? ? ? ?
?一般用于引用數(shù)據(jù)類型的初始化笛辟,利用開發(fā)中關(guān)于null的異 常功氨,輔助找出代碼中的錯誤。? ? NullPointerException