JAVA中的集合
内容将长期不断更新
有错误请指正,不胜荣幸
参考JAVA核心技术第10版
Collection
接口
在JAVA类库中,集合类的基本接口是Collection与Map。
这个接口有两个基本方法add和iterator。
迭代器 Iterator
Iterator接口
看下面的代码
public interface Iterator<E> {
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());
}
}
通过反复调用next方法,可以访问集合中的每一个元素,并对其进行某些操作。但是next方法达到了集合的末尾,继续调用将会发生NoSuchElementException异常。而解决这种问题的办法就是在调用next方法前,先调用hasNext方法。如果集合中还有元素能供迭代器进行访问,则返回true,否则返回false。
JAVA中的迭代器和其他类库中的迭代器是不一样的。类如C++中的迭代器,它会根据索引下标的方式来进行访问下一个元素,而JAVA的迭代器是位于两个元素中间,当next操作执行的同时,迭代器就越过下一个元素,并将越过的元素返回。如图所示
- 下面代码进行演示
//迭代器Iterator.
Iterator<Integer> iter = list.iterator();
while(iter.hasNext()) {
int elem = iter.next();
System.out.println(elem);
}
//使用Collection中提供的for each方法
//由于Collection接口扩展了Iterator接口,所以Java中的集合框架都可以使用for each迭代循环
for(int elem : list) {
System.out.println(elem);
}
JAVA中的Collection接口扩展了Iterator接口,所以在JAVA中几乎所有的集合都可以使用迭代器来循环访问集合。另外需要注意的是:元素被访问的顺序和集合的类型有关。
forEachRemaining
在JAVA SE 8中甚至不用写循环,可以调用forEachRemaining方法,然后提供一个lambda表达式。那么将会对迭代器的每一个元素调用这个lambda表达式,直到再没元素为止。
Remove
Remove方法将会删除上次调用next方法返回的那个元素。查看迭代器循环过程。
但JAVA的迭代器并不是按照索引下标来进行寻址访问,而是返回越过的那个元素。所以这就导致了一个问题:删除两个并列元素不能直接如下操作
iter.remove();
iter.remove();
这样会导致一个java.lang.IllegalStateException异常。所以连续删除前需要先调用next方法。如下:
iter.next();
iter.remove();
iter.next();
iter.remove();