再谈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

 

posted @ 2020-04-15 18:03  菊次郎的幻想  阅读(190)  评论(0编辑  收藏  举报

begin