四.原始碼解讀
一.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.方法:查詢,增加,刪除。遍歷