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的源碼吧。未完待續...

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章