看看 AbstractList 吧 java 9

    看集合类,那么就按顺序从 List 开始看吧,第一个映入眼帘的就是 AbstractList,从这个图就已经比较清晰的看到继承了什么类,还有什么类继承 AbstractList。微信

    还能够补充一点实现的接口,这里比 AbstractCollection 多了 List 接口,代表本身是集合类中 List 的特性。dom

    在 List 接口中,还有三个接口继承了的List 接口 ObservableList<E>, ObservableListValue<E>, WritableListValue<E>,以前写代码可能就关注了 List 接口,下次去了解这三个接口作了什么事情。序列做为有序的集合,该接口的用户能够精确地控制在列表中插入每一个元素的位置,用户能够经过其整数索引(在列表中的位置)访问元素,并搜索列表中的元素。其中有趣的是注意到建立不可变 List 的工厂方法 List.of() ,重载写了这么多实现干吗。里面的元素是不能够改的,不然会抛出 UnsupportedOperationException,可是元素自己是可变的除外。做者还在文档里指出"它们是以值为基础的。调用方不该该对返回实例的标识作出任何假设。工厂方法能够自由地建立新实例或重用现有实例。所以,对这些实例的身份敏感操做(=、哈希代码和synchronization)是不可靠的,应该避免。"编码

    能够看到这个工厂方法实际是由 ImmutableCollections 类的静态方法实现的,咱们拿其中一个代码先看看。能够看到咱们返回的实际上是 List1 这个继承了 AbstractImmutableList,这个AbstractImmutableList 里定义了一些方法,因此这里没有的方法就会抛出那个异常。不过定义这么多 List1 2 3 4 5 6 ......干吗,后面还有一个不肯定参数的方法,我尚未 get 这里的点。设计

    而后咱们还能够看一下不肯定参数数量的时候是怎么样的,其实 ImmutableCollections 里面还有其余集合的不可变方法,下次应该还会看到。如今接口有了 default ,做者好像都把一些接口往上层挪,应该是为了复用和维护考虑吧。3d

    回到 AbstractList ,咱们能够看到里面实现了哪些方法 ,这样继承的类通常是不用再实现了,直接就能够用了。对象

    让咱们看看几个方法吧,就是查这个元素在序列中有没有,若是没有那么返回 -1 ,至于 -1 有什么特殊含义呢?blog

    这个方法里面比较重要的是获取 ListIterator 吧,里面就是如下这几个经济实用的方法,固然这个继承的也是 Iterator  接口。固然默认这里传入的是0,也会对index 的范围作一个检验rangeCheckForAdd(index);,而后运行 new ListItr(index)。继承

    其实这里返回的 ListItr ,一个实现了 ListIterator 接口和 Itr 的静态内部类索引

    在 Itr 中主要看看咱们常常在编码中使用的 next()接口

    能够看到在这些方法在执行前都会有一个验证的逻辑,这里是不加锁的,咱们下次再来理理大神是怎么处理的,用来判断数据变更是怎么控制的。

       这里先验证了 subListRangeCheck,而后根据是否实现了 RandomAccess 来调用不一样的实现,下次看看 RandomAccess 的神奇之处。

    而后来看看 equals 方法是怎么实现了,能够了解在 ACM 简单题中都会有比较两个 List 是怎么实现的。第一步比较二者是否同一个对象,而后看是不是否 List (验明正身),继续得到两个迭代器,由于入参是 Object 因此 ListIterator<?> 中用 ? 来代替,在比较最短长度的 List 都是否相同后,再比较长的那个是否还有元素,若是相等就相等了。可能我秒速的比较笼统,不知道讲清楚了没。

    再看看 List 是怎么计算 hashCode,遍历其中的元素一一计算累加,这里用的31也是挺有趣的2的5次方减1

    在集合类的设计中,用到了不少静态的内部类,虽然看着是难看了一点!

    有什么讨论的内容,能够加我微信公众号:

相关文章
相关标签/搜索