再谈ArrayList LinkedList Set等集合的java原理
英文中有个词语,叫做迭代,名为:Iterable
显然,这是个形容词,叫做可迭代的,于是jdk1.5版本,开始引入了这样一个接口,这样一个interface,看着就很炫,很有概念,很有思想,给人以无限的联想,想着能够实现好多好多的类,仿佛开启了一扇门,进入了新世界
这是所有集合的的接口入口,看到有个iteator,那就是所有集合都可以调用iterator,这个没毛病,例如,list.iterator().xx
Iterator里面的方法就在下面了,不作解释了
hasNext(),就是用来给实现类寻找数组中的下一个成员是否存在,告诉下一个是否为空,存不存在,指针动吗?不动,当然,结果肯定是布尔值的
next(),返回类型是E,就是Iterator中的成员,意思是找到数组中下一个成员,并获取,指针么毋庸置疑,肯定动了
remove(),移除这个成员,
forEachRemaining(),我们本来有个forEach,现在有添加一个,使用范例:list.iterator().forEachRemaining(str->{ }) 这也是一种遍历的新写法,写法高大上而已,jdk1.8开始
forEach是一种新的遍历集合的写法,你说他怎么实现的,不好意思,他语义就这样,就像for循环,你说底层是汇编AJMP跳转,寄存器判断,还是如何,不得而知了
spliterator是一种可分割迭代器,这要来干嘛的?你想,你手上有100万数据,你遍历100万要100万次,如果你的计算机同时遍历25万,分四次,这样不就大大提高了遍历效率?这个方法就是派这个用的,既然能够并行遍历,你想想,那岂不就是多线程遍历?是不是一个新大门?
接下来是Iterable<E>的子接口Collection<E>,这个接口干嘛的?不争,从jdk1.2开始,就存在着这样的一个所有集合的父类接口
1、size() 获取集合元素大小
2、isEmpty是否为空判断
3、contains是否包含某个对象
4、iterator(),有病不?Iterable接口里面也有这样的方法,
5、toArray(),其实就是把数组中的所有元素组合成为一个新数组,类型都是Object
6、add()
7.remove()
8.containsAll(),这个判断是否包含另外一个数组,布尔返回
9.addAll()
10.removeAll(),移除子数组,显然是父数组的一个子集嘛
11.removeIf() ,其实就是给你整合了一个remove()元素的方法,采用lambda表达式,但是还是要写条件,和for循环移除元素,效果是一样的,真的是为了创新而创新,这样的方法,可读性差,鸡肋
12.retainAll(),集合调用了这个方法,参数是另外一个集合,只有参数是原集合的子集,返回结果是true,怎么样,这种方法新奇不?
13.clear(),这个方法干嘛的?将集合中的所有元素清除,不争了把?
14.equals() ,判断集合对象是否相等,注意是值相等,对象相等可以用等号的
15.hashCode(),这个计算数组集合的hashcode,不用解释了吧
16.spliterator(),这个和Iterable里面的一样的,只是接口的继承之后,又重写了一遍,为啥这样?这样才能体现出重写的特点嘛,你看,Override都写上了,目的就是为了集合在调用spliterator的时候,这个方法再调用父类Iterable的iterator(),
17.stream(),这个是可以并行化操作的类似于Iterator的的一种stream()
18.paralleStream(),一种并行的玩意儿,调用了之后,可以最大程度的来使用并行操作,很时髦,很酷炫的操作
一路开挂的Sun架构师开启了巅峰,
Josh Bloch——java集合框架的创始人,你们看到这么多眼花缭乱的集合,List,Set,现在用的人这么多,想想都是谁写的?是的,他叫约书亚-布洛克,这个大哥写出了惊世骇俗的集合框架,排名十大java人物第六名
来看看一个抽象实现
1、AbstractCollection,这就是给用来新建实例的一个方法,需要的时候,AbstractCollectionxxx = new AbstractCollection() 想想是这样的嘛?new后面的构造方法显然没有参数的,这样,不就让子类调用方法的时候,都不需要添加声明类型了呀,不过,eclipse里面代码报黄,那是肯定的
2、iterator()不争,让子类来调用迭代器的,总不能说让子类来调用父类的父类吧
3、size(),集合成员个数,不用解释了吧
4、isEmpty(),这个就不争了,任何子类
5、contains(),判断是否有包含子数组
6、toArray(),转换方法呗
7、toArray(T [])这个重写了嘛
8、add,
9、remove
10、retianAll()
11、cllear()
12、toString()这些方法望文生义,不解释了
再来看一个子类AbstractList
是不是看着渐渐的熟悉了?里面的方法好多都是父类的声明,对吧?为啥会存在?当然是继承Collection接口,而且实现了List接口
看看,这不就是List里面声明的所熟悉的接口方法,对不对
而且,AbstractList 继承的是这个抽象类AbstractCollection
上面的方法好多,都是比较熟悉的,应该不用过多介绍了,迭代方法,数组大小,是否为空,是否包含,转数组,都不用介绍了,这些都是为了给子类用来调用的,那么,子类是啥呢?
当然是著名的:ArrayList