1. 程式人生 > 其它 >四.原始碼解讀

四.原始碼解讀

一.Arrays類

1.sort()

Arrays.sort(arr)

Arrays有多個過載的sort()方法,既可以按照自然順序排序,也可以傳入比較器引數定製順序排序

2.index binarySearch(arr,key)

3.copyOf:拷貝陣列

  Arrays.copyOf(srcArray,newLength)

  System.arrayCopy(srcArray,0,destArray,0,length)

(1)int[] copyOf(int[] original, int newLength)    //original:原陣列,newLength:新陣列的長度

(2)底層採用System.arraycopy() 實現,這是一個native方法。

void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);  //length:拷貝的長度

4.fill(arr,val)

將陣列中的元素全部替換成同一個元素

5.List asList(arr)

可以將一個數組快速的轉換成List

1 String[] str = {"a","b","c"};
2 List<String> listStr = Arrays.asList(str);

注意:

(1)返回的陣列的檢視,所以只能檢視,修改,不能增刪,對list的修改,會反映到陣列

(2)只能傳入引用型別陣列,不能傳入基本型別陣列

(4)已知陣列資料,如何快速獲取一個可進行增刪改查的列表List

List<String> listStr = new ArrayList<>(Arrays.asList(str));
1 String[] str = {"a","b","c"};
2 List<String> listStr = new ArrayList<>(Arrays.asList(str));
3 listStr.add("d");
4 System.out.println(listStr.size());//4

6.Arrays.toString(arr)

返回陣列內容的字串形式,列印的時候比較有用,就不用遍歷了

二.Objece類

Object類的方法有:(12種)

(1)類載入相關:getClass()  返回一個物件的執行時類

(2)需要重寫:toString(),equals(o),hashCode()

(3)淺克隆:clone()

(4)垃圾回收:finalize()  jvm自動呼叫,一般不需要程式設計師手動去呼叫

(5)多執行緒通訊方法:wait() *3,notify() / notifyAll()

(6)registerNatives方法:在類載入的時候是會執行該方法的,通過該方法來註冊本地方法。

1.equals()方法

(1)沒有重寫,和 == 作用一樣。String類重寫了equals方法,用於比較兩個物件的內容是否相等

(2)一般重寫equals方法,都要重寫hashCode方法。hashCode方法宣告相等物件必須具有相同的雜湊程式碼,如果equals重寫了,比較的是內容是否相等,那麼也要重寫hashCode方法,使得內容相同的兩個物件返回相同的hashCode

2.getClass方法  返回一個物件的執行時類(得到一個物件的Class物件)Class物件就叫執行時類

(1)該方法的作用是返回一個物件的執行時類,通過這個類物件(Class物件)我們可以獲取該執行時類的相關屬性和方法。也就是Java中的反射

(2)Java中還有一種這樣的用法,通過 類名.class 獲取這個類的類物件,這兩種用法有什麼區別呢?

    結論:class 是一個類的屬性(靜態的),能獲取該類編譯時的類物件,而 getClass() 是一個類的方法,它是獲取該類執行時的類物件。

3.hashCode方法  返回一個物件的雜湊碼

(1)在 JDK 的 Integer類,Float 類,String 類等都重寫了 hashCode 方法,我們自定義物件也可以參考這些類來寫。

4.toString()方法  返回一個物件的字串表示

(1)預設返回:類名@hashCode

(2)列印物件時,預設呼叫 toString 方法,比如 System.out.println(person),等價於System.out.println(person.toString())

三.Integer類

-128<=int <=127都被包裝到快取中

(1)Integer的宣告:public final class Integer extends Number implements Comparable<Integer>{}

  不可被繼承,實現了Comparable介面

(2)方法:valueOf(str),parsInt(str)

      equals(i):比較包裝型別是否相等要用equals方法

(3)compareTo(Integer anotherInteger)和compare(int x,int y)

    compareTo()內部直接呼叫了compare方法,按照字典序比較大小(x<y:返回-1,x==y:返回0,x>y:返回1)

1 System.out.println(Integer.compare(1, 2));//-1
2 System.out.println(Integer.compare(1, 1));//0
3 System.out.println(Integer.compare(1, 0));//1

四.String類

五:ArrayList類

1.欄位屬性

(1)預設大小:10(2)Object[] elementData:儲存元素的陣列(3)size

2.構造方法

public ArrayList(Collection<? extends E> c)  將已有的集合複製到ArrayList集合中去

3.方法

(1)當通過ArrayList() 構造一個空集合,初始長度是為0的,第 1 次新增元素,會建立一個長度為10的陣列

(2)遍歷:普通for,

      迭代器iterator:如果在遍歷的時候要刪除元素,不能呼叫ArrayList的remove()方法,而是要呼叫迭代器的remove()方法。不能新增元素

      forEach:其實是迭代器的變種

      迭代器:ListIterator:相比於 Iterator 迭代器,這裡的 ListIterator 多出了能向前迭代,以及能夠新增元素

六.LinkedList類

1.欄位屬性:size,Node first,Node last

2.遍歷:for迴圈,迭代器

  迭代器比for迴圈效率高

七.HashMap類

1.java中的hashCode方法就是雜湊函式,可以將一個物件的地址轉換成雜湊碼(把物件地址當成key)

2.底層實現:jdk1.7及以前:陣列+連結串列,jdk1.8開始:陣列+連結串列+紅黑樹

3.HashMap的定義:HashMap是一個雜湊表,它儲存的是鍵值對,而且 key 和 value 都可以為 null

4.欄位屬性

  初始容量:16(必須是2的整數倍)(2)預設填充因子:0.75f

①、Node<K,V>[] table

③、loadFactor:負載因子

④、threshold:計算公式:capacity * loadFactor,閾值。過這個數目,就要resize

5.HashMap中的雜湊演算法:

把一個物件的hashCode進行取模運算:index=hashCode%tableSize。只不過對取模運算進行了優化:index=hashCode & (table.size-1)

      物件相等,hashCode相等。hashCode相等,物件不一定相等

      為什麼重寫equals方法的時候,要重寫hashCode方法?

6.方法

(1)新增元素put(key,value)。如果key已經存在,則會覆蓋value

(2)判斷是否存在給定的 key 或者 value。  containsKey(Object key)  containsValue(Object value)

(3)遍歷元素:keySet(),entrySet()

①、分別獲取 key 集合和 value 集合。

②、獲取 key 集合,然後遍歷key集合,根據key分別得到相應value

③、得到Entry 集合,然後遍歷 Entry

④、迭代

基本上使用第三種方法是效能最好的,

  第一種遍歷方法在我們只需要 key 集合或者只需要 value 集合時使用;

  第二種方法效率很低,不推薦使用;

  第四種方法效率也挺好,關鍵是在遍歷的過程中我們可以對集合中的元素進行刪除。

7.總結

  ①、基於JDK1.8的HashMap是由陣列+連結串列+紅黑樹組成,當連結串列長度超過 8 時會自動轉換成紅黑樹,當紅黑樹節點個數小於 6 時,又會轉化成連結串列。相對於早期版本的 JDK HashMap 實現,新增了紅黑樹作為底層資料結構,在資料量較大且雜湊碰撞較多時,能夠極大的增加檢索的效率。

  ②、允許 key 和 value 都為 null。key 重複會被覆蓋,value 允許重複。

  ③、非執行緒安全

  ④、無序(遍歷HashMap得到元素的順序不是按照插入的順序)

八.HashSet類

1.HashSet是基於HashMap實現的,所有的鍵值對中的value=PRESENT,PRESENT是一個Object物件

2.方法:查詢:contains(key),增加:add(e),刪除:remove(e)

    遍歷:(1)forEach迴圈(2)迭代器

九.LinkedHashMap類

1.LinkedHashMap類基於HashMap實現,具有HashMap集合的所有特點。但LinkedHashMap是有序的,因為 LinkedHashMap 在 HashMap 的基礎上單獨維護了一個具有所有資料的雙向連結串列,該連結串列保證了元素迭代的順序。即:LinkedHashMap = HashMap + LinkedList

2.方法:查詢,增加,刪除。和HashMap中一樣

    遍歷:也是4種

十.LinkedHashSet類

1.基於LinkedHashMap實現

十二.TreeMap類

存的是鍵值對,但是可以根據鍵排序

1.欄位屬性

  ①、Comparator②、Entry

2.方法:查詢,增加,刪除。遍歷