1. 程式人生 > 實用技巧 >webpack原始碼講解

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介面特點:

  1. 它是一個元素存取有序的集合。例如,存元素的順序是11、22、33。 那麼集合中,元素的儲存就是按照11.
    22、33的順序完成的)。
  2. 它是一個帶有索引的集合,通過索弓|就可以精確的操作集合中的元素(與陣列的索引是一個道理)。
  3. 集合中可以有重複的元素,通過元素的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(list list)使用前提
    被排序的集合裡邊儲存的元素,必須實現Comparable,重寫介面中的方法compareTo定義排序的規則
    Comparable介面的排序規則:
    自己(this)-引數:升序

4.Map集合

現實生活中,我們常會看到這樣的一種集合: IP地址與主機名,身份證號與個人,系統使用者名稱與系統使用者物件等,
這種一對應的關係 ,就叫做對映。Java提供了 專門的集合類用來存放這種物件關係的物件,即java.util.Map接
口。javo.util.Mop<k,v>集合

Map集合的特點:

  1. Map集合是一個雙列集合, 一個元素包含兩個值(一個key, 一個value)
  2. Map集合中的元素, key和value的資料型別可以相同,也可以不同
  3. Map集合中的元素, key是不允許重複的,value是可以重複的
  4. Map集合中的元素, key和value是一對應

單列集合和雙列集合的對比:

  • Collection中的集合,元素是孤立存在的(理解為單身) ,向集合中儲存元素採用一個個元素的方式儲存。
  • Map中的集合,元素是成對存在的(理解為夫妻)。每個元素由鍵與值兩部分組成,通過鍵可以找對所對應的值。
  • Collection中的集合稱為單列集合. Map中的集合稱為雙列集合.
  • 需要注意的是,Map中的集臺個能包含重複的鍵,值可以重複;每個鍵只能對應一個值。

Map集合常用的方法:

  1. public V put(K key, V value):把指定的鍵 與指定的值新增到Map集合中。
    返回值:v
    儲存鍵值對的時候, key不重複,返回值V是null
    儲存鍵值對的時候,key重複,會使用新的value替換map中重複的value,返回被替換的value值

  2. public V remove(0bject key): 把指定的鍵所對應的鍵值對元素在Map集合中刪除,返回被刪除元素的值。
    返回值:V
    key存在, v返回被刪除的值
    key不存在, v返回null

  3. public V get(Object key)根據指定的鍵,在Map集合中獲取對應的值。
    返回值:
    key存在,返回對應的value值
    key不存在,返回null

  4. boolean containsKey(object key) 判斷集合中是否包含指定的鍵。
    包含返回true,不包含返回false

Map集合遍歷鍵找值方式

鍵找值方式:即通過元素中的鍵,獲取鍵所對應的值

分析步驟:

  1. 獲取Map中所有的鍵,由於鍵是唯一的 ,所以返回一個Set集合儲存所有的鍵。方法提示: keyset()
  2. 遍歷鍵的Set集合,得到每一個鍵。
  3. 根據鍵,獲取鍵所對應的值。方法提示: 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檢視。

實現步驟:

  1. 使用Map集合中的方法entrySet(),把Map集合中多個Entry物件取出來,儲存到一個Set集合中
  2. 遍歷Set集合,獲取每一個Entry物件
  3. 使用Entry物件中的方法getKey( )和getValue( )獲取鍵與值

HashMap儲存自定義型別鍵值

Map集合保證key是唯一的:

作為key的元素,必須重寫hoshCode方法和equals方法,以保證key唯一

  1. key:String型別
    String類重寫hashCode方法和equals方法,可以保證key唯一
    value:Person型別
    value可以重複(同名同年齡的人視為同一個)

  2. 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集合的特點:

  1. HoshMap集合底層是雜湊表:查詢的速度特別的快
    JDK1. 8之前:陣列+單向連結串列
    JDK1. 8之後:陣列+單向連結串列/紅黑樹(連結串列的長度超過8) :提高查詢的速度
  2. hashMap集合是一個無序的集合,儲存元素和取出元素的順序有可能不一致

4.2 Map集合常用子類---LinkedHashMap<K,V>

java. util. LinkedHashMap<k,v>集合extends HashMap<k, v>集合

LinkedHashMap<K,V> : HashMap下有個子類LinkedHashMap,儲存資料採用的雜湊表結構+連結串列結構。
通過連結串列結構可以保證元素的存取順序一致;通過雜湊表結構可以保證的鍵的唯一、不重複 ,需要重寫鍵的
hashCode(方法、equals()方法。

LinkedHashMap的特點:

  1. LinkedHashMap集合底層是雜湊表+連結串列(保證迭代的順序)
  2. 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 iterator() 返回在此collection 的元素上進行迭代的迭代器。

迭代器的使用步驟(重點):
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.如果方法的引數有多個,那麼可變引數必須寫在引數列表的末尾