本帖最后由 冥夜 于 2014-11-27 00:29 编辑
在集合的视频中有讲到,在用一个迭代器来遍历一个集合时,只能使用这个迭代器来操作该集合内的元素,否则会出现异常。为什么呢?以下是楼主的个人理解:因为在使用其他类的方法来操作遍历中的元素时,若出现增加删除等操作,将会改变角标,而这时迭代器并不知道改变所以会出现安全隐患,所以直接就禁止使用非迭代器的方法在迭代器进行迭代时改变元素。
以下是代码,假设需要移除保存了字符串的ArrayList集合al中所有值为str的字符串则定义了一个方法:
private static void myremove(ArrayList<String> al,String str)
{
/*错误方法:使用集合的删除方法来删除
for(Iterator<String> it=al.iterator();it.hasNext();)
{
String s=it.next();
if(str.equals(s))
{
al.remove();/将会报异常。
}
*/
/*方法一:不遍历,使用集合本身的方法来删除
if(al.contains(str))
al.remove(str);
*/
/*
* 方法2:创建一个新集合,存入不想删除的元素,最后返回该集合。PS:应把前面void改为ArrayList<String>
ArrayList<String> a=new ArrayList<String>();
for(ListIterator<String> it=al.listIterator();it.hasNext();)
{
String s=it.next();
if(!str.equals(s))
{
a.add(s);
}
}
return a;
*/
//方法三:使用迭代器的删除方法来删除
for(Iterator<String> it=al.iterator();it.hasNext();)
{
String s=it.next();
if(str.equals(s))
{
it.remove();//用迭代器遍历时只能使用迭代器的方法操作元素,否则会出现异常。
}
}
|