zoukankan      html  css  js  c++  java
  • 大数据之路week01--自学之集合_2(列表迭代器 ListIterator)

    列表迭代器:

      ListIterator listerator():List集合特有的迭代器

      该迭代器继承了Iterator迭代器,所以,就可以直接使用hasNext()和next()方法

    特有功能:

      Object previous();获取上一个元素

      boolean hasPrevious():判断是否有元素

      注意:ListIterator可以实现逆向遍历,但是必须先正向遍历,才能逆向遍历,所以一般无意义,不使用

     1 package com.wyh.Iterator;
     2 
     3 import java.util.ArrayList;
     4 import java.util.Iterator;
     5 import java.util.List;
     6 import java.util.ListIterator;
     7 
     8 /** 
     9 * @author WYH
    10 * @version 2019年11月9日 下午7:31:41
    11 * 
    12 * ListIterator : List集合特有的迭代器
    13 * 
    14 */
    15 public class ListIteratorDemo1 {
    16     public static void main(String[] args) {
    17         //创建集合
    18         List i = new ArrayList();
    19         
    20         //创建字符串对象并将其添加到集合中
    21         i.add("王友虎");
    22         i.add("李宏灿");
    23         i.add("赵以浩");
    24         i.add("齐博源");
    25         i.add("李先锋");
    26         
    27         //ListIterator 继承了 Iterator,所以可以用它的实现
    28         Iterator it = i.iterator();
    29         while(it.hasNext()) {
    30             String s = (String)it.next();
    31             System.out.println(s);
    32         }
    33         System.out.println("----------------------");
    34 
    35         
    36         // previous()逆向打印
    37         ListIterator list = i.listIterator();
    38         /*//如果逆向打印处于第一个位置,输出为空
    39          * System.out.println("------------逆向打印------------------");
    40         while(list.hasPrevious()) {
    41             String s3 = (String)list.previous();
    42             System.out.println(s3);
    43         }*/
    44         while(list.hasNext()) {
    45             String s2 = (String)list.next();
    46             System.out.println(s2);
    47         }
    48         System.out.println("------------逆向打印------------------");
    49         while(list.hasPrevious()) {
    50             String s3 = (String)list.previous();
    51             System.out.println(s3);
    52         }
    53         
    54         
    55         
    56     }
    57 
    58 }


    一个十分重要出现问题的点,也是面试经常会问到的点。并发修改错误。

    问题: 我有一个集合,如下,请问,我想判断里面有没有"李宏灿"这个元素,如果有,我就添加一个元素到集合中,请写代码实现。

    于是大部分人不知道这个并发修改错误的时候,会按照自己的逻辑按照以下代码实现:

     1  /*//创建迭代器(Iterator迭代器)(错误示范-----------------)
     2         Iterator it = list.iterator();
     3         //找到元素并进行添加张国兴
     4         while(it.hasNext()) {
     5             String s = (String)it.next();
     6             if("李宏灿".equals(s)) {
     7                 list.add("123");
     8             }
     9         }
    10         System.out.println("list:"+list);*/

    结果,我们发现报错,可是我们的逻辑是没有错的,那到底错在哪呢?(报错:并发修改异常:ConcurrentModificationException

    产生的原因:

      迭代器是依赖于集合而存在的,在判断成功后,集合中添加了新的元素,而迭代器却不知道你已经添加了新元素,所以就报错了,这个错叫并发修改异常。

    如何解决呢:

      A: 迭代器迭代元素,迭代器修改元素,我们使用List集合特有的迭代器:ListIterator listerator()

        结果:元素是跟在刚才迭代查找到的元素的后面

      B:集合遍历元素,集合修改元素(普通的for循环实现)

        结果:在末尾进行添加

    代码实现:

     1 package com.wyh.Iterator;
     2 
     3 import java.util.ArrayList;
     4 import java.util.List;
     5 import java.util.ListIterator;
     6 
     7 /** 
     8 * @author WYH
     9 * @version 2019年11月9日 下午7:51:26
    10 * 
    11 * 并发修改异常:ConcurrentModificationException
    12 * 
    13 */
    14 public class ListIteratorDemo2 {
    15     public static void main(String[] args) {
    16         //创建集合对象
    17         List list = new ArrayList();
    18         
    19         //创建字符串对象并将其添加到集合中去
    20         list.add("王友虎");
    21         list.add("李宏灿");
    22         list.add("赵以浩");
    23         list.add("齐博源");
    24         list.add("李先锋");
    25         
    26         /*//创建迭代器(Iterator迭代器)(错误示范-----------------)
    27         Iterator it = list.iterator();
    28         //找到元素并进行添加张国兴
    29         while(it.hasNext()) {
    30             String s = (String)it.next();
    31             if("李宏灿".equals(s)) {
    32                 list.add("123");
    33             }
    34         }
    35         System.out.println("list:"+list);*/
    36         
    37         //方法1:创建ListIterator迭代器,迭代器调用add方法进行添加
    38         ListIterator listt = list.listIterator();
    39         while(listt.hasNext()) {
    40             String s = (String)listt.next();
    41             if("李宏灿".equals(s)) {
    42                 listt.add("张国兴"); //在找到的元素后面进行添加
    43             }
    44         }
    45         System.out.println("list:"+list);
    46         
    47         //方法2:利用for循环直接对集合进行遍历,集合中有添加的方法
    48         for(int i = 0;i<list.size();i++) {
    49             String s = (String)list.get(i);
    50             if(s.equals("李宏灿")) {
    51                 list.add("张果喜"); //在末尾进行添加
    52             }
    53         }
    54         System.out.println("list:"+list);
    55         
    56         
    57         
    58     }
    59 
    60 }
  • 相关阅读:
    mongdb 拓展的下载地址和编译安装(php)
    Linux-CentOs7-svn安装及钩子配置
    centos 安装php7、pecl 、swoole、redis拓展
    MOD 10,11算法(GB/T 17710-1999 数据处理 校验码系统 )的 Python实现
    .NetCore源码阅读笔记系列之HttpAbstractions(五) Authentication
    .NetCore源码阅读笔记系列之Security (四) Authentication & AddJwtBearer
    .NetCore源码阅读笔记系列之Security (三) Authentication & AddOpenIdConnect
    .NetCore下利用Jenkins如何将程序自动打包发布到Docker容器中运行
    如何将自己的Image镜像Push到Docker Hub
    Kubernetes图形化归纳总结基础介绍整理
  • 原文地址:https://www.cnblogs.com/wyh-study/p/11827935.html
Copyright © 2011-2022 走看看