Java Collection 集合框架详解
Iterable(迭代器)接口
他是一个java迭代器,规范(提供)了java集合的迭代方法。
方法:
1.1.1Iterator<T> iterator()
它返回一个Iterator类型,即迭代器。
Tip:其实吧,方法大都还是用过,就是没去看过源码,下面进行源码探讨。
一般来说不同的集合类型,其结构不同比如LinkedList和ArrayList,其迭代方式也不相同,固对于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的Iterator
创建一个拼接器。 Spliter继承了iterable的迭代器的fail-fast属性。Implementation Note:通常应该覆盖默认的实现。 由默认实现返回的分割器具有差的分割能力,未定义,并且不报告任何分割器特征。 实施课程几乎总能提供更好的实现。结果一个 Spliterator
在由此描述的元件 Iterable
。这里对他的讲解暂略。 实现要求:
1.2 小结
现在我们对Iterable接口有了一定的认识,因为其是Collection的父接口,所以他是为Java Collection集合框架提供迭代方法的(提供迭代的功能),当然了具体实现因为不同的集合有不同的结构,实现方式也不一样,但是本质是一样的,就是对集合的一个迭代。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~