java集合源码分析(一)---整体
吐槽
这个月要把java的集合好好重新看下了,把上个月没看的补上,突然发现自己写了这么久的安卓,集合那块都忘的差不多了,自己看了下自己当时写的集合的博客,写的真心烂唉。
自己当时学的时候的博客
主要的目的是搞清楚集合底部的实现原理,和几个的具体的区别
学习的方式:看大佬的博客 + 自己看源码代码 + 画流程图
大佬博客链接:大佬博客专栏
集合的整体框架结构
在这张图里面,我们发现里面就三大类东西
- 集合接口:6个接口(短虚线表示),表示不同的集合类型
- 抽象类:5个抽象类(长虚线表示),对接口的部分实现
- 实现类:8个实现类(实线表示),对接口的具体试现
在图中我们也发现,集合也分为两个派系,一个Collection和Map
Collection接口
Collection接口是集合类的根接口,它没有具体的实现,但是让其两个儿子Set和List,其中Set中不能包含重复的元素。List是一个有序的集合,可以包含重复的元素,提供了按索引访问的方式。
我们去官方文档看下:
好像就是这个就是个接口,里面有一大堆的方法,而且我们发现里面这个接口,进去看下这个接口的源码,发现里面的方法都是添加元素,删除元素,返回集合中的个数,以及清空集合,但是里面也有一个特殊的方法
Iterator<E> iterator();
返回在这个集合上面的迭代器
public interface Collection<E> extends Iterable<E> {
..........
int size();
boolean isEmpty();
boolean contains(Object o);
Iterator<E> iterator();
Object[] toArray();
................
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
然后我们发现这个类居然也继承另一个类Iterable,我们也进去看下这个类
public interface Iterable<T> {
/**
* Returns an iterator over elements of type {@code T}.
*
* @return an Iterator.
*/
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}
这个类也是个接口,主要的方法也是那个方法 Iterator iterator();返回这个集合上面的迭代器
所以,逻辑很清晰,父接口 Iterable里面,就一个iterator 方法,返回一个terator 迭代器,然后子接口Collection,还是有这个返回迭代器的方法,然后加了许多其他的方法
我们接着去看下Iterator具体实现
Iterator接口
我们还是先去看下官方的文档
好像看了下,就是简单的一个接口,它有三个方法,具体的实现还需要看它的具体实现类
Collection派系
其中,ArrayList,HashSet,LinkedList,TreeSet是我们经常会有用到的已实现的集合类。
Map派系
还是先看下官方的文档
Map实现类用于保存具有映射关系的数据。Map保存的每项数据都是key-value对,也就是由key和value两个值组成。Map里的key是不可重复的,key用户标识集合里的每项数据。
HashMap,TreeMap是我们经常会用到的集合类
总结
今天就是简单的看下集合的总体框架什么的,具体的慢慢再看