java的迭代器详解

java的迭代器详解

迭代器的引出

在jdk1.5版本之前是没有 foreach的,然而1.5版本就加上了foreach,而引入的新的foreach功能并不是在jvm上进行改进的因为代价太高,甲骨文工程师想到了一个比较好的办法就是在编译器中引入迭代器的概念从而实现foreach遍历。

请看一段代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//      功能 使用HashSet存储、删除、遍历 几个学生的信息
         HashSet<Student> hash =  new  HashSet<Student>();
         hash.add( new  Student( "张三" 20 ));
         hash.add( new  Student( "李四" 21 ));
         hash.add( new  Student( "王二" 22 ));
         hash.add( new  Student( "麻子" 23 ));
         
         String st1 =  "hello" ;
         String st2 =  "hello" ;
         String st3 = st2;
         System.out.println(st1 == st3);
         
//      删除一个姓名为张三的学生
         String name1 =  "张三" ;
         boolean  flag =  true ;
         for  (Student student : hash) {
             String name2 = student.getName();
             
             if (name1 == name2){
                 hash.remove(student);
                 flag =  false ;
                 break ;
             }
         }
         if (flag){
             System.out.println( "不存在" );
         }
         
         for  (Student s : hash) {
             System.out.println(s);
         }

 而上面的代码在运行多次的时候会出现下列错误异常:

这个错误是在遍历集合的同时删除了集合中的数据,这种写法不保证线程安全

怎么解决?上面的写法是不同的人做了不同的事   解决办法就是让一个人即遍历又删除   这就引出了 迭代器

先看下迭代器的简单用法:

我先把迭代器比作导游 集合里存的都是景点

请看上面的红色箭头是从最开始位置出现 然后通过迭代器的next()一个个往下找  

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//      迭代器的用法
         
//      1、创建集合
         ArrayList<String> al =  new  ArrayList<String>();
         al.add( "张三" );
         al.add( "李四" );
         al.add( "王二" );
         
//      创建迭代器对象  注意这里创建迭代器不是用new  而是用集合的方法
         
         Iterator<String> it = al.iterator();
         
         while (it.hasNext()){
             String s = it.next();
             System.out.println(s);
         }

 改写异常之后的写法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//      功能 使用HashSet存储、删除、遍历 几个学生的信息
         HashSet<Student> hash =  new  HashSet<Student>();
         hash.add( new  Student( "张三" 20 ));
         hash.add( new  Student( "李四" 21 ));
         hash.add( new  Student( "王二" 22 ));
         hash.add( new  Student( "麻子" 23 ));
         
         String st1 =  "hello" ;
         String st2 =  "hello" ;
         String st3 = st2;
         System.out.println(st1 == st3);
         
//      删除一个姓名为张三的学生
         String name1 =  "张三" ;
         boolean  flag =  true ;
 
         Iterator<Student> it = hash.iterator();
         while (it.hasNext()){
             Student s = it.next();
             if (name1.equals(s.getName())){
                 it.remove();
                 flag =  false ;
                 break ;
             }
         }
         if (flag){
             System.out.println( "不存在" );
         }
         
         for  (Student s : hash) {
             System.out.println(s);
         }

 迭代器的底层原理

根据图所示 为达到方法的统一性所有集合都是实现了Interable接口 通过实现接口的方法创建并返回一个Iterator对象

然后通过创建内部类实现Iterator 里所有的方法最终目的是为了统一所有集合中的方法名称一样

http://www.fsj6077.cn/
http://www.tvz4241.cn/
http://www.gzh1725.cn/
http://www.dox1148.cn/
http://www.xip7382.cn/
http://www.ngm1905.cn/
http://www.dmb8658.cn/
http://www.nqa8573.cn/
http://www.esz4596.cn/
http://www.nhs9541.cn/
http://www.kfq4961.cn/
http://www.fsi2703.cn/
http://www.ybc8953.cn/
http://www.myy9223.cn/
http://www.paf5803.cn/
http://www.njb8631.cn/
http://www.kzo4326.cn/
http://www.tso8557.cn/
http://www.nwm1536.cn/
http://www.tae4138.cn/
http://www.dxc3579.cn/
http://www.ffp5727.cn/
http://www.lhb4836.cn/
http://www.xdi0113.cn/
http://www.bpa2365.cn/
http://www.fks8445.cn/
http://www.aht8537.cn/
http://www.cun5054.cn/
http://www.gdk7028.cn/
http://www.ypk8666.cn/
http://www.wan2959.cn/
http://www.sit9945.cn/
http://www.zmj4226.cn/
http://www.ccn6233.cn/
http://www.jck8045.cn/
http://www.ckk6213.cn/
http://www.mak1390.cn/
http://www.vii0197.cn/
http://www.pwj5001.cn/
http://www.wvh4263.cn/
http://www.mvg0339.cn/
http://www.yif9712.cn/
http://www.jta0960.cn/
http://www.omx8816.cn/
http://www.nlc4773.cn/
http://www.dep9137.cn/
http://www.vlq7732.cn/
http://www.umg2515.cn/
http://www.kog1435.cn/
http://www.nxf9936.cn/
http://www.hqh7518.cn/
http://www.hij5984.cn/
http://www.vui9639.cn/
http://www.fzl7156.cn/
http://www.wue0833.cn/
http://www.dye6768.cn/
http://www.ryh7899.cn/
http://www.lij0467.cn/
http://www.epv8502.cn/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值