for :和iterator.next()是一个东西吗,他们有什么区别没?大侠看看下面的代码第一种:
public static void removeEvensVer2( List<Integer> lst>
{
for(Integer x : lst)
if(x%2==0)
lst.remove(x);
}第二种:
public static void removeEvensVer2( List<Integer> lst>
{
Iterator<Integer> itr = lst.iterator();
while(itr.hasNext())
if(x%2==0)
itr.remove(x);
}如果上面有区别,能帮我详细解释一下吗,谢谢先。:-)
public static void removeEvensVer2( List<Integer> lst>
{
for(Integer x : lst)
if(x%2==0)
lst.remove(x);
}第二种:
public static void removeEvensVer2( List<Integer> lst>
{
Iterator<Integer> itr = lst.iterator();
while(itr.hasNext())
if(x%2==0)
itr.remove(x);
}如果上面有区别,能帮我详细解释一下吗,谢谢先。:-)
解决方案 »
- 关于泛型不明白的地方
- 关于类的构造方法的个人理解。。高手进来指点一下!!!
- 我只会用myeclipse来开发jsp+javabean程序,开发gui要什么工具?
- 高分请教:如何实现在浏览器里远程执行一个带界面的软件
- 请问:Enum类是派什么用的?它和Enumeration接口间有何关系?
- 请教:JAVA中如何获得当前行
- 你们觉得jdk1.5的泛型用起来爽么?
- Jbuilder中为何Config Servers配置后无‘确定’按钮?
- 急,急,急!关于在win98下安装autocad r14的问题! 500分!在线等待!
- jbuilder中关于光标位置不适当的问题怎样解决?记得精华区有文章的,但怎么找也找不到
- 如何不修改一个类,添加功能
- 扫雷 小问题 求解
public interface java.lang.Iterable{
public abstract java.util.Iterator iterator();
}
/**
*
*/
package o;import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;/**
* @author Administrator
*
*/
public class MyJava
{ public static void main(String[] args)
{ List lst = new LinkedList();
lst.add(6);
lst.add(5);
lst.add(1);
lst.add(4);
lst.add(2);
removeEvensVer2(lst);
// removeEvensVer3(lst);
} public static void removeEvensVer2(List<Integer> lst)
{
for (Integer x : lst)
if (x % 2 == 0)
lst.remove(x);
System.out.println(lst);
} public static void removeEvensVer3(List<Integer> lst)
{
Iterator<Integer> itr = lst.iterator();
while (itr.hasNext())
if (itr.next() % 2 == 0)
itr.remove();
System.out.println(lst);
}}removeEvensVer2抛异常,removeEvensVer3正常,为什么呢?
at java.util.LinkedList$ListItr.checkForComodification(Unknown Source)
at java.util.LinkedList$ListItr.next(Unknown Source)
at o.MyJava.removeEvensVer2(MyJava.java:33)
at o.MyJava.main(MyJava.java:27)
改成下面的代码
Integer even;
while (itr.hasNext())
if ((even = itr.next()) % 2 == 0){
lst.remove(even);你将会看到一样的异常报出。
问题在于对List做遍历的时候修改了List,而不在于for:和Iterator的差别。for:确实是在利用Iterator做事情,和直接用Iterator没有太大差别。
此类的 iterator 和 listIterator 方法返回的迭代器是快速失败 的:在迭代器创建之后,如果从结构上对列表进行修改,除非通过迭代器自身的 remove 或 add 方法,其他任何时间任何方式的修改,迭代器都将抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不冒将来不确定的时间任意发生不确定行为的风险。 for (Integer x : lst)
if (x % 2 == 0)
lst.remove(x);//这里是调用list的remove,不是迭代器的remove
+1 正解!for循环增强形式,在对数组、容器都可使用
而Iterator只能在容器中使用
所以我们都用迭代删除也就是Iterator
第二种 迭代器,通常只要实现了ConnlCollection下Integer接口的类都能使用,
通常我们将Integer写成一个固定的类或方法进行调用!
但是进行深入研究后,您会发现 Iterator 实际上有两个十分有用的功能。
第一,Iterator 支持从源集合中安全地删除对象,只需在 Iterator 上调用 remove() 即可。这样做的好处是可以避免 ConcurrentModifiedException,这个异常顾名思意:当打开 Iterator 迭代集合时,同时又在对集合进行修改。有些集合不允许在迭代时删除或添加元素,但是调用 Iterator 的 remove() 方法是个安全的做法。
第二,Iterator 支持派生的(并且可能是更强大的)兄弟成员。ListIterator,只存在于 List 中,支持在迭代期间向 List 中添加或删除元素,并且可以在 List 中双向滚动。
双向滚动特别有用,尤其是在无处不在的 “滑动结果集” 操作中,因为结果集中只能显示从数据库或其他集合中获取的众多结果中的 10 个。它还可以用于 “反向遍历” 集合或列表,而无需每次都从前向后遍历。插入 ListIterator 比使用向下计数整数参数 List.get() “反向” 遍历 List 容易得多。