jdk源码阅读(ⅠSet接口相关类)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/zhang_jian__/article/details/81949346

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

猜你喜欢

转载自blog.csdn.net/zhang_jian__/article/details/81949346