1. Iterator 接口
public interface Iterator {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
1.1 Iterator遍历
@Test
public void test() {
List list = new ArrayList();
list.add("111");
list.add("222");
list.add("333");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String next = iterator.next();
}
}
多层遍历
@Test
public void test() {
Map> map = new HashMap();
map.put(1001L, new HashSet(Arrays.asList("aaa", "bbb")));
map.put(1002L, new HashSet(Arrays.asList("ccc")));
// Iterator> iterator = map.values().iterator();
String next = map.values().iterator().next().iterator().next();
// 输出 next: aaa
}
1.2 遍历时注意事项
迭代过程中不能进行删除、添加操作,会抛异常java.util.ConcurrentModificationException
@Test
public void test() {
List list = new ArrayList();
list.add("111");
list.add("222");
list.add("333");
for (String str : list) {
if ("111".equals(str)) {
list.remove("111");
// list.add("444");
}
}
}
报错原因:
private class Itr implements Iterator {
final void checkForComodification() {
if (modCount != expectedModCount)
throw new ConcurrentModificationException();
}
}
改为iterator.remove()
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
if ("111".equals(iterator.next())) {
iterator.remove();
}
}
2. Iterable 接口
public interface Iterable {
Iterator iterator();
default void forEach(Consumer super T> action) {
Objects.requireNonNull(action);
for (T t : this) {
action.accept(t);
}
}
}
实现 Iterable 接口,就拥有了获取迭代器的能力
2.1 集合里的迭代器
Collection 继承了 Iterable 接口
public interface Collection extends Iterable {
Iterator iterator();
}
public interface List extends Collection {
Iterator iterator();
}
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable {
public Iterator iterator() {
return new Itr();
}
// 内部类实现了 Iterator
private class Itr implements Iterator {
public boolean hasNext() {}
public E next() {}
public void remove() {}
}
}
2.2 Iterable 存在的意义
解耦,有些集合有多个 Iterator 内部类,可以获取不同的 Iterator 执行不一样的操作,比如ArrayList,LinkedList
public class ArrayList extends AbstractList
implements List, RandomAccess, Cloneable, java.io.Serializable {
public ListIterator listIterator() {
return new ListItr(0);
}
public Iterator iterator() {
return new Itr();
}
private class Itr implements Iterator {}
private class ListItr extends Itr implements ListIterator {}
}
【信息由网络或者个人提供,如有涉及版权请联系COOY资源网邮箱处理】
© 版权声明
部分内容为互联网分享,若有侵权请联系站长删除。
THE END
暂无评论内容