最近学习了Java的集合框架,现在将其总结一下。
上面就是框架的大致类图。
说Iterable接口前先说一下Iterator:
这是一个对集合进行迭代的一个迭代器。见下面的源码
package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
boolean hasNext();//如果仍有元素可以迭代,则返回true
E next();//返回迭代的下一个元素
//从迭代器指向的Collection中移除迭代器返回的最后一个元素
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
使用Iterator遍历容器的元素
public class Test {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> iterator=list.iterator();
while(iterator.hasNext()){
Integer integer=iterator.next();
System.out.println(integer);
}
}
}
输出结果:
1
2
3
4
5
Process finished with exit code 0
我们有时候要在遍历容器时,删除某一个元素,可能有人会这样子做。
public class Test {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> iterator=list.iterator();
while(iterator.hasNext()){
Integer integer=iterator.next();
if(integer.equals(2)){
list.remove(integer);
}
System.out.println(integer);
}
}
}
输出结果:
1
2
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at com.demo.Test.main(Test.java:17)
Process finished with exit code 1
如果要避免上述异常,我们不使用容器的删除方法,而是直接调用Iterator的删除方法
public class Test {
public static void main(String[] args) {
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);
list.add(5);
Iterator<Integer> iterator=list.iterator();
while(iterator.hasNext()){
Integer integer=iterator.next();
if(integer.equals(2)){
iterator.remove();
}
System.out.println(integer);
}
}
}
输出结果:
1
2
3
4
5
Process finished with exit code 0
报错的原因跟Iterator的实现源码有关,具体可以参见篇博客https://www.cnblogs.com/snowater/p/8024776.html
接着我们可以来说一下Iterable这个接口了。
迭代器(Iterator)主要用来操作java中的集合对象(Collection),迭代器提供了统一的语法进行集合对象(Collection)遍历操作,无需关心集合对象内部的实现方式,java提供了一个迭代器接口Iterator,Iterator只能向前移,无法后退;
先看一下其源码
package java.lang;
import java.util.Iterator;
import java.util.Objects;
import java.util.Spliterator;
import java.util.Spliterators;
import java.util.function.Consumer;
public interface Iterable<T> {
//返回一个内部元素为T类型的迭代器
Iterator<T> iterator();
//一种新的遍历集合的方式,对内部元素进行遍历,并对元素进行指定的操作,JDK1.8添加
default void forEach(Consumer<? super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
//创建并返回一个可分割迭代器,JDK1.8添加
default Spliterator<T> spliterator() {
return Spliterators.spliteratorUnknownSize(iterator(), 0);
}
}