概述
Iterator使用及ArrayList遍历注意事项
(一)Iterator
- Iterator接口是java集合框架成员,Iterator主要用于遍历Collection集合中的元素,Iterator对象也被称为迭代器。
- Iterator接口隐藏了各种Collection实现类的底层细节,功能比较简单,并且只能单向移动。
(1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。
(2) 使用next()获得序列中的下一个元素。
(3) 使用hasNext()检查序列中是否还有元素。
(4) 使用remove()将迭代器新返回的元素删除。
(二)ArrayList遍历注意事项
- 【切记】Iterator对象的remove方法是迭代过程中删除元素的唯一方法
- 下面我们来看ArrayList遍历中的陷阱:
import java.util.ArrayList;
public class ArrayListRemove
{
public static void main(String[] args)
{
ArrayList<String> list = new ArrayList<String>();
list.add("a");
list.add("b");
list.add("b");
list.add("c");
list.add("c");
list.add("c");
remove(list);
for (String s : list)
{
System.out.println("element : " + s);
}
}
public static void remove(ArrayList<String> list)
{
// TODO:
}
如果要想删除list的b字符,有下面两种常见的错误例子:
- 错误写法实例一:
public static void remove(ArrayList<String> list)
{
for (int i = 0; i < list.size(); i++)
{
String s = list.get(i);
if (s.equals("b"))
{
list.remove(s);
}
}
}
错误的原因:这种最普通的循环写法执行后会发现第二个“b”的字符串没有删掉。
错误写法实例二:
public static void remove(ArrayList<String> list)
{
for (String s : list)
{
if (s.equals("b"))
{
list.remove(s);
}
}
}
错误的原因:这种for-each写法会报出著名的并发修改异常:java.util.ConcurrentModificationException。
-先解释一下实例一的错误原因:针对错误写法一,在遍历第一个字符串b时因为符合删除条件,所以将该元素从数组中删除,并且将后一个元素移动(也就是第二个字符串b)至当前位置,导致下一次循环遍历时后一个字符串b并没有遍历到,所以无法删除。针对这种情况可以倒序删除的方式来避免:
public static void remove(ArrayList<String> list)
{
for (int i = list.size() - 1; i >= 0; i--)
{
String s = list.get(i);
if (s.equals("b"))
{
list.remove(s);
}
}
}
因为数组倒序遍历时即使发生元素删除也不影响后序元素遍历。
对于第二种的解释是:在对Collection类进行迭代时,要调用删除元素时必须调用Iterator的remove()方法,而不能调用Collection的remove()方法。所以正确的迭代方法是下面的代码所示:
public static void remove(ArrayList<String> list)
{
Iterator it = list.iterator();
while(it.hasNext()){
String s = it.next();
if( s.equals("b")){
it.remove();
}
}
}
最后
以上就是傻傻狗为你收集整理的Iterator使用及ArrayList遍历注意事项的全部内容,希望文章能够帮你解决Iterator使用及ArrayList遍历注意事项所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复