1. 程式人生 > >jdk原始碼閱讀(ⅠSet介面相關類)

jdk原始碼閱讀(ⅠSet介面相關類)

HashSet原始碼閱讀筆記
1、是建立在HashMap的基礎之上的,通過HashMap的各個方法進行實現的。
2、內部擁有一個HashMap,這個map就是儲存HashSet所有元素的。
3、內部還有一個假的Object物件。這個物件就是在向map中放入key的時候對應的value。無實際意義,只是為了滿足HashMap的語法。
4、實現了序列化的介面,可以用流傳輸。
5、實現了克隆介面,可進行物件複製,但值得注意的是,HashSet的複製需要把成員變數map一起復制,否則沒有用。
6、實現了Set介面,也就實現了所有Set介面規定的方法,其實部分方法不是HashSet自己實現的,是它整合的父類實現。
7、繼承了抽象類AbstractSet,另外AbstractSet的父類AbstractCollection也實現了一些方法。

AbstractSet原始碼閱讀筆記
1、主要是增加了幾個方法:removeAll()、HashCode()、equals();
2、繼承了抽象類AbstractCollection.擁有了其很多方法。
3、equals()方法:同一個物件返回true;集合中所有元素都相同返回true。
4、removeAll方法:刪除兩個集合公有的元素。該方法有優化,只迴圈集合長度小的。
5、hashCode方法:返回所有元素的hashCode之和。

ps:檢視原始碼追到native方法即可,除非你想看jvm底層實現的C++的程式碼。
AbstractCollection原始碼閱讀筆記
1、擁有的抽象方法(由其子類進行實現):iterator();size()
2、判空方法isEmpty():長度為空則為空。
3、包含方法contains():只有當目標物件和集合中的物件相等才返回true。
4、轉陣列方法,可以指定泛型T[],也可以用Object[]。
5、所有繼承該類的集合最大長度為Integer最大值-8.
6、add方法,無實際用途,子類都會覆蓋這個方法才支援add,否則報錯不支援。
7、remove方法,根據傳入物件,然後從集合中刪除掉。不管是不是null。
8、子集判斷containsAll(),如果有一個物件不在集合中,目標集合就不是集合的子集。
9、addAll(),返回是否修改,有增加返回true.
10、removeAll()刪除和目標集合的交集。
11、retainAll()只保留子集,將其他的刪除。
12、clear(),迭代集合,全部remove.
13、toString()將所有物件的toString拼接到一起返回。

TreeSet原始碼閱讀筆記
1、類似HashSet,TreeSet也是依賴map的實現類的。背後的map是NavigableMap,通用擁有一個無意義的Object型別的物件PRESENT.
2、descendingIterator返回一個降序的迭代。
3、descendingSet返回一個降序的集合NavigableSet。
4、addAll(c)如果目標集合有序則按照有序方式合併,否則按照AbstractSet合併。
5、好像所有set都是map實現的,還是先看map的原始碼吧。未完待續...