webpack原始碼講解
1.集合概述
集合定義:
- 集合:集合是java中提供的一種容器,可以用來儲存多個數據。
集合和陣列的區別:
- 陣列的長度是固定的。集合的長度是可變的。
- 陣列中儲存的是同一型別的元素,可以儲存基本資料型別值。集合儲存的都是物件。而且物件的型別可以不一
致。在開發中一般當物件多的時候,使用集合進行儲存。
2.Collection
JAVASE提供了滿足各種需求的API ,在使用這些API前,先了解其繼承與介面操作架構,才能瞭解何時採用哪個
類,以及類之間如何彼此合作,從而達到靈活應用。
-
Collection :單列集合類的根介面,用於儲存一系列符合某種規則的元素,它有兩個重要的子介面,分別是
java.util.List 和java.util.Set 其中,List的特點是元素有序、元素可重複。Set 的特點是元素無
序,而且不可重複。List 介面的主要實現類有java. util.Arraylist和java.util. LinkedList,Set介面
的主要實現類有java. util.HashSet和java. util. TreeSet。
-
Collection集合的常用功能
Collection是所有單列集合的父介面,因此在Collection中定義了單列集合(List和Set)通用的一些方法,這些方法可
用於操作所有的單列集合。方法如下:
●public boolean add(E e)
:把給定的物件新增到當前集合中。
●public void clear()
:清空集合中所有的元素。
●public boolean remove(E e)
:把給定的物件在當前集合中刪除。
●public boolean contains(E e)
:判斷當前集合中是否包含給定的物件。
●public boolean isEmpty()
:判斷當前集合是否為空。
●public int size()
●
public object[] toArray()
:把集合中的元素,儲存到陣列中。
2.1 List集合
java.util. List介面繼承自collection介面,是單列集合的一個重要分支,習慣性地會將實現了List介面的對
象稱為List集合。在List集合 中允許出現重複的元素,所有的元素是以一種線性方式進行儲存的,在程式中可以通
過索引來訪問集合中的指定元素。另外, List集合還有一個特點就是元素有序 ,即元素的存入順序和取出順序一
致。
List介面特點:
- 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。 那麼集合中,元素的儲存就是按照11.
22、33的順序完成的)。 - 它是一個帶有索引的集合,通過索弓|就可以精確的操作集合中的元素(與陣列的索引是一個道理)。
- 集合中可以有重複的元素,通過元素的equals方法,來比較是否為重複的元素。
List介面中常用方法:
- public void add(int index, E element) : 將指定的元素,新增到該集合中的指定位置上。
- public E get(int index) :返回集合中指定位置的元素。
- public E remove(int index) :移除列表中指定位置的元素,返回的是被移除的元素。
- public E set(int index, E element) :用指定元素替換集合中指定位置的元素,返回值的更新前的元素。
2.1.1 ArrayList集合
java.util.ArrayList 集合資料儲存的結構是陣列結構。元素增刪慢,查詢快,由於日常開發中使用最多的功能
為查詢資料、遍歷資料,所以Arraylist是最常用的集合。
構造方法:
ArrayList() 構造一個初始容量為十的空列表。
常用方法:
void add(int index, E element) 在此列表中的指定位置插入指定的元素。
boolean add(E e) 將指定的元素追加到此列表的末尾。
void clear() 從列表中刪除所有元素。
Object clone() 返回此 ArrayList例項的淺拷貝。
boolean contains(Object o) 如果此列表包含指定的元素,則返回 true 。
E get(int index) 返回此列表中指定位置的元素。
boolean isEmpty() 如果此列表不包含元素,則返回 true 。
Iterator<E> iterator() 以正確的順序返回該列表中的元素的迭代器。
E remove(int index) 刪除該列表中指定位置的元素。
E set(int index, E element) 用指定的元素替換此列表中指定位置的元素。
int size() 返回此列表中的元素數。
2.1.2 LinkedList集合
java. util.Linkedlist集合implements List介面
特點:
1.底層是一個連結串列結構:查詢慢,增刪快
2.裡邊包含了大量操作首尾元素的方法
注意:使用L inkedList集合特有的方法,不能使用多型
java. util.LinkedList集合資料儲存的結構是連結串列結構。方便元素新增、刪除的集合。
LinkedList是一個雙向連結串列,那麼雙向連結串列是什麼樣子的呢,我們用個圖瞭解下
實際開發中對一個集合元素的新增與刪除經常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。
●public void addFirst(E e) :將指定元素插入此列表的開頭。
●public void addLast(E e) :將指定元素新增到此列表的結尾。
●public E getFirst() :返回此列表的第一個元素。
●public E getLast() :返回此列表的最後一個元素。
●public E removeFirst() :移除並返回此列表的第一個元素。
●public E removeLast() :移除並返回此列表的最後一個元素。
●public E pop() :從此列表所表示的堆疊處彈出一個元素。
●public void push(E e) :將元素推入此列表所表示的堆疊。
●public boolean isEmpty() :如果列表不包含元素,則返回true.
2.2 Set集合
java.util.set介面和java.util.List介面一樣,同樣繼承自collection介面,它與collection介面中的方法
基本一致,並沒有對Collection介面進行功能上的擴充,只是比Collection介面更加嚴格了。與List介面不同
的是,Set 介面中元素無序,並且都會以某種規則保證存入的元素不出現重複。
Set介面的特點:
1.不允許儲存重複的元素
2.沒有索引,沒有帶索引的方法,也不能使用普通的for迴圈遍歷
tips:Set集合取出元素的方式可以採用 :迭代器、增強for。
2.2.1 HashSet集合
java.util.HashSet是Set介面的一個實現類,它所儲存的元素是不可重複的,並且元素都是無序的(即存取順序
不一致)。 java.util.HashSet 底層的實現其實是一個java.util.HashMap支援。
HashSet是根據物件的雜湊值來確定元素在集合中的儲存位置,因此具有良好的存取和查詢效能。保證元素唯一
性的方式依賴於: hashCode 與equals方法。
HashSet特點:
1.不允許儲存重複的元素
2.沒有索引,沒有帶索引的方法,也不能使用普通的for迴圈遍歷
3.是一個無序的集合,儲存元素和取出元素的順序有可能不一致
4.底層是一個雜湊表結構(查詢的速度非常的快)
雜湊值
雜湊值:是一個十進位制的整數,由系統隨機給出(就是物件的地址值,是一個邏輯地址,是模擬出來得到地址,不是資料實際儲存的實體地址)
在Object類有一個方法,可以獲取物件的雜湊值
int hashCode() 返回該物件的雜湊碼值。
hashCode方法的原始碼:
public native int hashCode();
native:代表該方法呼叫的是本地作業系統的方法
雜湊表
在JDK1.8之前,雜湊表底層採用陣列+連結串列實現,即使用連結串列處理衝突,同一hash值的連結串列都儲存在一個連結串列裡。
但是當位於一個桶中的元素較多,即hash值相等的元素較多時,通過key值依次查詢的效率較低。而JDK1.8中 ,哈
希表儲存採用陣列+連結串列+紅黑樹實現,當連結串列長度超過閾值(8)時,將連結串列轉換為紅黑樹,這樣大大減少了查詢
時間。
Set集合儲存元素不重複的原理
HashSet儲存自定義型別元素
set集合報錯元素唯一:
儲存的元素(String, Integer....student, Person...),必須重寫hashCode方法和equals方法
2.2.2 LinkedHashSet集合
java. util.LinkedHashSet集合extends HashSet集合
LinkedHashSet集合特點:
底層是一個雜湊表(陣列+連結串列/紅黑樹)+連結串列:多了一條連結串列(記錄元素的儲存順序),保證元素有序
3.Collections集合工具類
java.utils.Collections是集合工具類,用來對集合進行操作。
常用功能:
- public static
boolean addAll(Collection C, T... elements) :往集合中新增一些元素。 - public static void shuffle(List<?> list) 打亂順序:打亂集合順序。
- public static
void sort(List list) }:將集合中元素按照預設規則排序。 - public static
void sort(List list , Comparator<? super T> ) :將集合中元素按照指定規則排序。
注意:
sort(listlist)使用前提
被排序的集合裡邊儲存的元素,必須實現Comparable,重寫介面中的方法compareTo定義排序的規則
Comparable介面的排序規則:
自己(this)-引數:升序
4.Map集合
現實生活中,我們常會看到這樣的一種集合: IP地址與主機名,身份證號與個人,系統使用者名稱與系統使用者物件等,
這種一對應的關係 ,就叫做對映。Java提供了 專門的集合類用來存放這種物件關係的物件,即java.util.Map接
口。javo.util.Mop<k,v>集合
Map集合的特點:
- Map集合是一個雙列集合, 一個元素包含兩個值(一個key, 一個value)
- Map集合中的元素, key和value的資料型別可以相同,也可以不同
- Map集合中的元素, key是不允許重複的,value是可以重複的
- Map集合中的元素, key和value是一對應
單列集合和雙列集合的對比:
- Collection中的集合,元素是孤立存在的(理解為單身) ,向集合中儲存元素採用一個個元素的方式儲存。
- Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。
- Collection中的集合稱為單列集合. Map中的集合稱為雙列集合.
- 需要注意的是,Map中的集臺個能包含重複的鍵,值可以重複;每個鍵只能對應一個值。
Map集合常用的方法:
-
public V put(K key, V value):把指定的鍵 與指定的值新增到Map集合中。
返回值:v
儲存鍵值對的時候, key不重複,返回值V是null
儲存鍵值對的時候,key重複,會使用新的value替換map中重複的value,返回被替換的value值 -
public V remove(0bject key): 把指定的鍵所對應的鍵值對元素在Map集合中刪除,返回被刪除元素的值。
返回值:V
key存在, v返回被刪除的值
key不存在, v返回null -
public V get(Object key)根據指定的鍵,在Map集合中獲取對應的值。
返回值:
key存在,返回對應的value值
key不存在,返回null -
boolean containsKey(object key) 判斷集合中是否包含指定的鍵。
包含返回true,不包含返回false
Map集合遍歷鍵找值方式
鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值
分析步驟:
- 獲取Map中所有的鍵,由於鍵是唯一的 ,所以返回一個Set集合儲存所有的鍵。方法提示: keyset()
- 遍歷鍵的Set集合,得到每一個鍵。
- 根據鍵,獲取鍵所對應的值。方法提示: get(K key)
Entry鍵值對物件
我們已經知道,Map 中存放的是兩種物件, 一種稱為key(鍵) , 一種稱為value(值) ,它們在在Map中是一對應關
系,這一對物件又稱做Map中的一個Entry(項)。Entry 將鍵值對的對應關係封裝成了物件。即鍵值對物件,這
樣我們在遍歷Map集合時,就可以從每一個鍵值對 ( Entry )物件中獲取對應的鍵與對應的值。
既然Entry表示了一對鍵和值,那麼也同樣提供了獲取對應鍵和對應值得方法:
- public K getkey() :獲取Entry物件中的鍵。
- public V getValue() :獲取Entry物件中的值。
在Map集合中也提供了獲取所有Entry物件的方法:
- public Set<Map.Entry<K,V>> entryset() ;獲取到Map集合中所有的鍵值對物件的集合(Set集合)。
Map集合遍歷的第二種方式:使用Entry物件遍歷
Map集合中的方法:
Set<Map. Entry<K,V>> entrySet() 返回此對映中包含的對映關係的Set檢視。
實現步驟:
- 使用Map集合中的方法entrySet(),把Map集合中多個Entry物件取出來,儲存到一個Set集合中
- 遍歷Set集合,獲取每一個Entry物件
- 使用Entry物件中的方法getKey( )和getValue( )獲取鍵與值
HashMap儲存自定義型別鍵值
Map集合保證key是唯一的:
作為key的元素,必須重寫hoshCode方法和equals方法,以保證key唯一
-
key:String型別
String類重寫hashCode方法和equals方法,可以保證key唯一
value:Person型別
value可以重複(同名同年齡的人視為同一個) -
key:Person型別
Person類就必須重寫hashCode方法和equals方法,以保證key唯一
value:String型別
可以重複
4.1 Map集合常用子類---HashMap<K,V>
java. util .HashMap<k, v>集合implements Map<k, v>介面
- HashMap<K,V> :儲存資料採用的雜湊表結構,元素的存取順序不能保證一致。由於要保證鍵的唯一、不重
復,需要重寫鍵的hashCode(方法、equals()方法。
HashMap集合的特點:
- HoshMap集合底層是雜湊表:查詢的速度特別的快
JDK1. 8之前:陣列+單向連結串列
JDK1. 8之後:陣列+單向連結串列/紅黑樹(連結串列的長度超過8) :提高查詢的速度 - hashMap集合是一個無序的集合,儲存元素和取出元素的順序有可能不一致
4.2 Map集合常用子類---LinkedHashMap<K,V>
java. util. LinkedHashMap<k,v>集合extends HashMap<k, v>集合
LinkedHashMap<K,V> : HashMap下有個子類LinkedHashMap,儲存資料採用的雜湊表結構+連結串列結構。
通過連結串列結構可以保證元素的存取順序一致;通過雜湊表結構可以保證的鍵的唯一、不重複 ,需要重寫鍵的
hashCode(方法、equals()方法。
LinkedHashMap的特點:
- LinkedHashMap集合底層是雜湊表+連結串列(保證迭代的順序)
- LinkedHashMap集合是一個有序的集合 ,儲存元素和職出元素的順序是一致的
Hashtable集合
java. util . Hashtable<K, V>集合implements Map<K, V>介面
Hashtable:底層也是一個雜湊表,是一個執行緒安全的集合,是單執行緒集合,速度慢
HashMap:底層是一個雜湊表,是一個執行緒不安全的集合,是多執行緒的集合,速度快
HashMap集合(之前學的所有的集合):可以儲存null值, null鍵
Hashtable集合,不能儲存null值, null鍵
Hashtable和Vector集合一樣 ,在jdk1. 2版本之後被更先進的集合(HashMap, Arraylist)取代了
Hashtable的子類Properties依然活躍在歷史舞臺
Properties集合是一個唯一和I0流相結合的集合
5.Iterator迭代器
迭代的概念:即Collection集合元素的通用獲取方式。在取元素之前先要判斷集合中有沒有元素,如果有,就把這個
元素取出來,繼續在判斷,如果還有就再取出出來。一直把集合 中的所有元素全部取出。這種取出方式專業術
語稱為迭代。
獲取迭代器的方法:
- public Iterator iterator() ;獲取集合對應的迭代器,用來遍歷集合中的元素的。
java. util. Iterator介面:迭代器(對集合進行遍歷)
有兩個常用的方法:
- boolean hasNext() 如果仍有元素可以迭代,則返回true.
判斷集合中還有沒有下一個元素,有就返回true,沒有就返回false - E next() 返回迭代的下一個元素。
取出集合中的下一個元素
Iterator迭代器,是一個介面,我們無法直接使用,需要使用Iterator介面的實現類物件,獲取實現類的方式比較特殊
Collection介面中有一個方法,叫iterator(),這個方法返回的就是迭代器的實現類物件
Iterator
迭代器的使用步驟(重點):
1.使用集合中的方法iterator( )獲取迭代器的實現類物件,使用Iterator介面接收(多型)
2.使用Iterator介面中的方法hasNext判斷還有沒有下一個元素
3.使用Iterator介面中的方法next取出集合中的下一個元素
注意:
Iterotor
6.增強for迴圈
增強for迴圈(也稱for each迴圈)是JDK1.5以後出來的一個高階for迴圈,專門用來遍歷陣列和集合的。它的內部原
理其實是個Iterator迭代器,所以在遍歷的過程中,不能對集合中的元素進行增刪操作。
for(元素的資料型別變數 : collection集合or陣列){
//寫操作程式碼
}
它用於遍歷Collection和陣列。通常只進行遍歷元素,不要在遍歷的過程中對集合元素進行增刪操作。
tips: 新for迴圈必須有被遍歷的目標。目標只能是Collection或者是陣列。 新式for僅僅作為遍歷操作出現。
7.Vector集合
Vector類實現了可擴充套件的物件陣列。 像陣列一樣,它包含可以使用整數索引訪問的元件。 但是, Vector的大小可以根據需要增長或縮小,
以適應在建立Vector之後新增和刪除專案。
從Java 2平臺v1.2開始,該類改進了List介面,使其成為Java Collections Framework的成員。 與新的集合實現不同, Vector被同步。
如果不需要執行緒安全的實現,建議使用ArrayList代替Vector 。
8.可變引數
可變引數:是JDK1.5之後出現的新特性
-
使用前提:
當方法的引數列表資料型別已經確定 ,但是引數的個數不確定,就可以使用可變引數。 -
使用格式:定義方法時使用
修飾符返回值型別方法名(資料型別.. .變數名){} -
可變引數的原理:
可變引數底層就是一個數組,根據傳遞引數個數不同,會建立不同長度的陣列,來儲存這些引數
傳遞的引數個數,可以是個(不傳遞),1,2...多個 -
可變引數的注意事項
1.一個方法的引數列表,只能有一個可變引數
2.如果方法的引數有多個,那麼可變引數必須寫在引數列表的末尾