首页 > 其他分享 >foreach/增强for循环 中 使用iterator.remove();

foreach/增强for循环 中 使用iterator.remove();

时间:2023-04-06 20:58:27浏览次数:55  
标签:java iterator Iterator Utf8 remove util foreach

    Set<String> set = new HashSet<>();
    set.add("a");
    set.add("b");
    Iterator<String> iterator = set.iterator();
    for (String string : set) {
      iterator.next();
      iterator.remove();
    } 

 

Exception in thread "main" java.util.ConcurrentModificationException
    at java.base/java.util.HashMap$HashIterator.nextNode(HashMap.java:1597)
    at java.base/java.util.HashMap$KeyIterator.next(HashMap.java:1620)
    at lanqiao1.Main.main(Main.java:21)

 

仍会报错

原因大概是 foreach/增强for循环 实际上是一个iterator

而我们又定义了另外一个iterator让其next()和remove(),相当于两个iterator同时操作,Concurrent并发修改异常


很多文章使用反编译工具 反编译 foreach/增强for循环 的.class文件,来探究 底层是用迭代器模式进行遍历的

但是,不同反编译工具 反编译出来的结果似乎是不同的

我用jd-gui 反编译出来仍是 foreach/增强for循环

 

使用javap -verbose来尝试,发现没有源码,比较混乱

  #32 = InterfaceMethodref #25.#33        // java/util/Set.iterator:()Ljava/util/Iterator;
  #33 = NameAndType        #34:#35        // iterator:()Ljava/util/Iterator;
  #34 = Utf8               iterator
  #35 = Utf8               ()Ljava/util/Iterator;
  #36 = InterfaceMethodref #37.#39        // java/util/Iterator.next:()Ljava/lang/Object;
  #37 = Class              #38            // java/util/Iterator
  #38 = Utf8               java/util/Iterator
  #39 = NameAndType        #40:#41        // next:()Ljava/lang/Object;
  #40 = Utf8               next
  #41 = Utf8               ()Ljava/lang/Object;
  #42 = Class              #43            // java/lang/String
  #43 = Utf8               java/lang/String
  #44 = InterfaceMethodref #37.#45        // java/util/Iterator.remove:()V
  #45 = NameAndType        #46:#6         // remove:()V
  #46 = Utf8               remove
  #47 = InterfaceMethodref #37.#48        // java/util/Iterator.hasNext:()Z
  #48 = NameAndType        #49:#50        // hasNext:()Z
  #49 = Utf8               hasNext
  #50 = Utf8               ()Z

标签:java,iterator,Iterator,Utf8,remove,util,foreach
From: https://www.cnblogs.com/hhdom/p/17294116.html

相关文章

  • glib g_hash_table_lookup g_hash_table_remove
    这里会简单的说明一下例子中用到的api接口。GHashTable *g_hash_table_new(GHashFunc hash_func, GEqualFunc key_equal_func);功能:生成hash表。参数:hash_func创建hash值得函数,它为key创建一个hash值。这里可以用glib函数库里自带的g_str_hash。也可以用自......
  • mac remove system default short cut
    ......
  • JDK源码——集合类Iterator、 Collection类
    摘要主要是讲解这个集合的原理类相关的类。参看:https://zhuanlan.zhihu.com/p/165393520这个图由Map指向Collection的Produces并不是说Map是Collection的一个子类(子接口),这里的意思是指Map的KeySet获取到的一个视图是Collection的子接口。我们可以看到集合有两个基本接口:Map和Collec......
  • lambda中的forEach如何跳出循环
    lambda中的forEach如何跳出循环    前提   在Java8中的forEach()中,"break"或"continue"是不被允许使用的,而return的意思也不是原来return代表的含义了。forEach(),说到底是一个方法,而不是循环体,结束一个方法的执行自然是用return。    1. 在Java8中直接......
  • Error response from daemon: conflict: unable to remove repository reference "mic
    docker删除镜像时出现了这样的问题解决方法:强制删除docerrmi-f[IMAGEID]......
  • JS Iterator属性
    Iterator的作用:为各种数据结构,提供一个统一的、便捷的访问接口使得数据结构的成员能够按照某种次序排列es6创造了一种新的遍历命令for...of循环,Iterator主要供for...of循环ES6规定,默认的Iterator接口部署在数据结构的Symbol.iterator属性,或者说,一个数据结构只要具有S......
  • RemoveDuplicates
    packageLeetCode;/***26.删除有序数组中的重复项*给你一个升序排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度......
  • Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker from tr
    Writeoperationsarenotallowedinread-onlymode(FlushMode.NEVER/MANUAL):TurnyourSessionintoFlushMode.COMMIT/AUorg.springframework.dao.InvalidDataAccess......
  • 解决 Turn your Session into FlushMode.COMMIT/AUTO or remove 'readOnly' marker
    org.springframework.dao.InvalidDataAccessApiUsageException:Writeoperationsarenotallowedinread-onlymode(FlushMode.NEVER/MANUAL):TurnyourSessioninto......
  • 【线程池】使用ThreadLocal请务必remove
    背景:在一次扫描中被提示:Field[SESSION_CONTEXT]oftypeThreadLocalmustcallremove()methodatleastonetimes.(line34)嗯?啥子情况?搜索了一下,发现:ThreadLo......