Java Collection 集合框架详解

 


Java Collection 集合框架详解

1.1 Collection 的父接口Iterable

  Collection为java的核心集合框架,它是一个接口继承了Iterable接口。有诸多实现类。在介绍Collection之前先来说一下他的父接口Iterable

Iterable(迭代器)接口

  他是一个java迭代器,规范(提供)了java集合的迭代方法。

方法:

 

 

1.1.1Iterator<T> iterator()

  它返回一个Iterator类型,即迭代器。

 

Tip:其实吧,方法大都还是用过,就是没去看过源码,下面进行源码探讨。

  一般来说不同的集合类型,其结构不同比如LinkedListArrayList,其迭代方式也不相同,固对于iterator()方法他们有不同的实现,对于LinkedList来说:它没有(自己)实现该方法,而是其父类AbstractSequentialList实现了该方法。LinkedList将其继承过来。那么其实现的方法内容是怎么样的呢?

我们看源码:

复制代码
public Iterator<E> iterator() {
     //调用istIterator()方法
     return listIterator();
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 public ListIterator<E> listIterator() {
     return listIterator(0);
 }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 public ListIterator<E> listIterator(final int index) {//index = 0;
         rangeCheckForAdd(index);
 ​
         return new ListItr(index);
     }
 ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 private class ListItr extends Itr implements ListIterator<E> {
         ListItr(int index) {
             //初始化指针位置,一开始为0,从下标0开始迭代
             cursor = index;
         }
/////////////后面省略
}
复制代码

 

  我们能够知道它其实是new了一个ListItr类进行返回,它是LinkedList的一个内部类(其实很多这样的集合类型,都在有一个内部类实现了Iterable接口,用于给自己进行迭代)

其方法如下:

LinkedList类的内部类Listltr

 

 

 

 

下面我们来看它(Iterator)(基本方法功能一样,由于结构不同迭代方式会不一样)一般是怎么进行迭代的。

复制代码
//hasNext判断当前指针位置是否已经在集合末尾(无下一位元素)
 while(linkedListIterator.hasNext()) {
     //next方法获取当前指针位置元素(下标),然后指针后移1位(下标+1)
     Integer elment = linkedListIterator.next();
     //打印获取的每个元素
     System.out.println(elment);
 }
 ​
 /////////////////////////////////////////////////////////////////////////////////////
 public boolean hasNext() {
             return nextIndex < size;
         }
 ​
 ////////////////////////////////////////////////////////////////////////////////////
 public E next() {
             checkForComodification();
             if (!hasNext())
                 throw new NoSuchElementException();
 ​
             lastReturned = next;
             next = next.next;
             nextIndex++;
             return lastReturned.item;
         }
复制代码

 

很容易知道hasNext()判断当前下标是否小于元素个数(及该指针所指元素是否为空),next()方法则是先获取当前指针所指元素(Node结点),然后再指针后移(next = next.next 

1.1.2 default void forEach(Consumer<? super T> action)

  对Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。 除非实现类另有规定,否则按照迭代的顺序执行操作(如果指定了迭代顺序)。 动作抛出的异常被转发给呼叫者。

复制代码
 //它是个默认方法,其实就是利用增强for循环,再根据Consumer接口中的accept(t)方法实现对每个元素的(迭代/遍历)处理
 default void forEach(Consumer<? super T> action) {
         Objects.requireNonNull(action);
         for (T t : this) {
             action.accept(t);
         }
     }
 // forEach方法遍历
         linkedList.forEach(new Consumer<Integer>() {
             @Override
             public void accept(Integer t) {
                 // TODO Auto-generated method stub
                 System.out.print(t+"qwq  ");
             }
         });
复制代码

说到遍历,这里再提一下增强for循环,如下为一个简单的增强for循环:

 for ( Integer e: linkedList) {
             System.out.print(e+"-for(:)  ");
         }

  那么增强for循环到底是什么原理呢?我们看一下上一段java源程序文件编译后的字节码文件就能够清楚的知道其实在编译后,增强for循环替换为使用迭代器进行迭代遍历。增强for循环的本质就是使用迭代器迭代

 Iterator var8 = linkedList.iterator();

         while(var8.hasNext()) {
             Integer e = (Integer)var8.next();
             System.out.print(e + "for(:)  ");
         }

 

 1.1.3 default Spliterator<T> spliterator()

  Iterable描述的元素上创建一个Iterable实现要求:默认实现从iterable的Iterator创建一个early-binding拼接器。 Spliter继承了iterable的迭代器的fail-fast属性。Implementation Note:通常应该覆盖默认的实现。 由默认实现返回的分割器具有差的分割能力,未定义,并且不报告任何分割器特征。 实施课程几乎总能提供更好的实现。结果一个 Spliterator在由此描述的元件 Iterable这里对他的讲解暂略。

 1.2 小结

  现在我们对Iterable接口有了一定的认识,因为其是Collection的父接口,所以他是为Java Collection集合框架提供迭代方法的(提供迭代的功能),当然了具体实现因为不同的集合有不同的结构,实现方式也不一样,但是本质是一样的,就是对集合的一个迭代。

posted @   暮色已现  阅读(135)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
点击右上角即可分享
微信分享提示