A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© \(^o^)/ 中级黑马   /  2014-4-23 13:23  /  934 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 \(^o^)/ 于 2014-4-24 00:26 编辑

  1. for(int x=0;x<a.size();x++)
  2. {
  3. sop(a.get(x));
  4. }

  5. for(Iterator it=a.iterator();it.hasNext();)
  6. {
  7. sop(it.next());
  8. }
复制代码
以上两种方法都可以输出元素,请问下迭代器和获取这两种方法的区别在哪里,一般用那种比较好。

5 个回复

倒序浏览
for(int x=0;x<a.size();x++)
{
sop(a.get(x));
}
这种方法只适合于list集合的。因为list集合中元素都有索引(就像数组的角标。)每一个元素都有唯一的一个索引数值与其对应,所以可以使用这种方法进行遍历。
但是对于set型和map型集合这种方法就无法使用了。因为这两型集合底层数据结构和list不同,其中不存在索引。
为了对所有集合都能进行方便的取出内部元素的操作,所以设立了一个通用规则:迭代器
回复 使用道具 举报
区别:迭代是collection集合所有集合都有的获取元素的方法,而用get方法回去元素的方法只有List集合有,因为List   集合是有序的
总结:List集合的四种迭代方式(及不同点):
  1. package cn.itheima.demo;

  2. import java.util.ArrayList;
  3. import java.util.Iterator;
  4. import java.util.List;
  5. import java.util.ListIterator;
  6. /*
  7. * List集合的四种迭代:见demo1(),demo2(),demo3(),demo4()
  8. * foreach和Iterator的区别:见demo5(),demo6()
  9. *
  10. * 第一种和第四种都是List集合特有的
  11. * 第二种和第三种都是collection集合都有的
  12. *
  13. *
  14. * foreach和Iterator的区别
  15. * foreach代码简单,底层是Iterator实现的,foreach中不可以删除集合中的元素,因为foreach没有remove的方法
  16. * 用Iterator中有remove,所以可以删除元素
  17. *                
  18. * 当方法检测到对象的并发修改,但不允许这种修改时,抛出此异常
  19. * 解析:由于foreach没有remove的方法,所以在使用list的remove的方法是时,就会检测到并发异常,foreach在迭代元素,
  20. * 突然list集合自己删了一个元素,这是就会发生并发修改
  21. *
  22. * ListIterator是Iterator的子接口,它不光可以删除元素,还可以添加元素 -->详情见demo4方法
  23. */
  24. @SuppressWarnings({ "rawtypes", "unchecked" })
  25. public class Demo {
  26.         public static void main(String[] args) {

  27.         }

  28.         //第一种迭代:List集合特有的
  29.         public static void demo1() {
  30.                 List list = new ArrayList();
  31.                 list.add("aaa");
  32.                 list.add("bbb");
  33.                 list.add("ccc");
  34.                 list.add("ddd");
  35.                 for (int x = 0; x < list.size(); x++) {
  36.                         System.out.println(list.get(x));
  37.                 }
  38.         }
  39.         //第二种迭代:List集合用迭代器来获取元素
  40.         public static void demo2() {
  41.                 List list = new ArrayList();
  42.                 list.add("aaa");
  43.                 list.add("bbb");
  44.                 list.add("ccc");
  45.                 list.add("ddd");
  46.                 Iterator it = list.iterator();
  47.                 while(it.hasNext()) {
  48.                         String str = (String)it.next();
  49.                         System.out.println(str);
  50.                 }
  51.         }
  52.         //第三种迭代:List集合用foreach来获取元素
  53.         public static void demo3() {
  54.                 List list = new ArrayList();
  55.                 list.add("aaa");
  56.                 list.add("bbb");
  57.                 list.add("ccc");
  58.                 list.add("ddd");
  59.                 for (Iterator it = list.iterator() ; it.hasNext() ;) {
  60.                         String str = (String)it.next();
  61.                         System.out.println(str);
  62.                 }
  63.         }
  64.         //第四种迭代:List集合用迭代器来获取元素
  65.         public static void demo4() {
  66.                 List list = new ArrayList();
  67.                 list.add("aaa");
  68.                 list.add("bbb");
  69.                 list.add("ddd");
  70.                 ListIterator li = list.listIterator();
  71.                 while(li.hasNext()) {
  72.                         String str = (String)li.next();
  73.                         if(str.equals("bbb")) {
  74.                                 li.add("ccc");        //listIterator可以添加元素
  75.                         }
  76.                 }
  77.                 System.out.println(list);
  78.         }
  79.        
  80.         public static void demo5() {
  81.                 List list = new ArrayList();
  82.                 list.add("aaa");
  83.                 list.add("bbb");
  84.                 list.add("ccc");
  85.                 list.add("ddd");
  86.                 Iterator it = list.iterator();
  87.                 while(it.hasNext()) {
  88.                         String str = (String)it.next();
  89.                         if(str.equals("ccc")) {
  90.                                 it.remove();
  91.                         }
  92.                         System.out.println(str);
  93.                 }
  94.                 System.out.println(list);
  95.         }
  96.        
  97.         public static void demo6() {
  98.                 List list = new ArrayList();
  99.                 list.add("aaa");
  100.                 list.add("bbb");
  101.                 list.add("ccc");
  102.                 list.add("ddd");
  103.                 Iterator it = list.iterator();
  104.                 for(Object o: list ) {
  105.                         String str = (String)it.next();
  106.                         if(str.equals("aaa")) {
  107.                                 list.remove("aaa"); //会抛出并发修改
  108.                         }
  109.                         System.out.println(str);
  110.                 }
  111.                 System.out.println(list);
  112.         }
  113. }
复制代码



回复 使用道具 举报
你get方法只是LIST中得特有方法 list集合有角标所以才能根据角标来获取元素,而其他set map集合是没有角标的,只能用特有方法 迭代来获取元素,所以迭代才是集合的标准获取元素方法
回复 使用道具 举报
迭代器有一个方法remove(),如果在for循环中使用,改变了循环条件,要报错,
另外。for通常用于遍历数组,
iterator用于迭代集合,hasnext能够有效的判断是否存在下一个元素

点评

不好意思亲,不小心点错了反对  发表于 2014-4-24 12:01
回复 使用道具 举报 0 1
您需要登录后才可以回帖 登录 | 加入黑马