千家信息网

java中迭代map的方式有哪些

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要介绍了java中迭代map的方式有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。迭代器原理:什么是迭代器,使用迭代器的
千家信息网最后更新 2025年11月09日java中迭代map的方式有哪些

这篇文章主要介绍了java中迭代map的方式有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。

    迭代器原理:

    什么是迭代器,使用迭代器的好处?

    迭代器就是用来遍历集合中对象的东西,也就是说,对于集合,我们不像对原始数组那样通过直接访问元素来迭代的,而是通过迭代器来遍历对象。这么做的好处是将对于集合类型的遍历行为与被遍历集合对象分离,这样以来,就不需要关心该集合类型的具体实现是怎么样的。只要获取这个集合对象的迭代器便可以遍历这个集合中的对象。而像遍历对象顺序以及怎么访问对象元素这些细节,全部由它自己的迭代器来处理。

    迭代器怎么实现的?

    首先集合要先实现iterable接口来表示此对象是可以进行迭代的。而实现iterable接口的对象实现了iterator方法,这个方法返回了一个Iterator对象。一个迭代器对象需要Iterator接口中的方法:hasNext(),next(),remove()。remove()方法会删除最近一次调用的元素,如果remove()之前没有调用next()的话直接调用remove()会产生报错信息(IllegalStateException)。我们在进行对集合对象迭代的时候,next()会返回当前对象第一个对象并返回,然后next会指向下一个元素,hasNext方法就是看这个指针后面还有没有元素了。

    迭代器的陷阱?

    使用for迭代的时候不可以使用集合进行remove操作。这时候需要使用迭代器进行迭代,然后使用迭代器中的remove方法进行删除。

    为什么会产生这样的错误?

    remove()方法在删除元素的时候,还会修改一个修改次数的标志位modCount,如果iterator的expectedModCount与modCount的大小不相等时,会抛出一个ConcurrentModificationException异常。modCount的目的主要是为了防止当前对象迭代过程中存在其他线程对当前对象的修改。

    // iterable接口源代码

    public interface Iterable {    /**     * Returns an iterator over elements of type {@code T}.     *     * @return an Iterator.     */    Iterator iterator();    default void forEach(Consumer action) {        Objects.requireNonNull(action);        for (T t : this) {            action.accept(t);        }    }    default Spliterator spliterator() {        return Spliterators.spliteratorUnknownSize(iterator(), 0);    }}

    // iterator接口源代码

    public interface Iterator {    /**    * 如果迭代拥有更多元素,那么返回true    */    boolean hasNext();    /**    * 返回iteration中的下一个元素    */    E next();    /**    * 如果删除一个集合中的元素没有调用这个方法,二十直接中集合中删除,那么这个迭代器的行为没有被指定    */    default void remove() {        throw new UnsupportedOperationException("remove");    }    /**    * 遍历集合中的剩余元素(如果之前调用了两次next()那么只会遍历集合中剩余元素    * 使用案例:    * Iterator it = map.keySet().iterator();        it.next();        it.next();        it.forEachRemaining(System.out::println);    */    default void forEachRemaining(Consumer action) {        Objects.requireNonNull(action);        while (hasNext())            action.accept(next());    }}

    HashMap中实现迭代的核心代码:

    final Node nextNode() {            Node[] t;            Node e = next; // 对象属性中的next是下一个值            if (modCount != expectedModCount)                throw new ConcurrentModificationException();            if (e == null)                throw new NoSuchElementException();            // next = e.next 如果e.next为null,那么继续找数组下一个不为null的值            if ((next = (current = e).next) == null && (t = table) != null) {                do {} while (index < t.length && (next = t[index++]) == null);            }            return e;        }
    public final void remove() {            Node p = current;            if (p == null)                throw new IllegalStateException();            if (modCount != expectedModCount)                throw new ConcurrentModificationException();            current = null;            K key = p.key;            removeNode(hash(key), key, null, false, false);            expectedModCount = modCount;

    遍历map的四种方式

    import java.util.*;import java.util.concurrent.ConcurrentHashMap;import java.util.HashMap;public class MapTest {    public static void main(String[] args) {        HashMap map = new HashMap();        map.put(0,1);        map.put(2,2);        map.put(1,2);        map.put(4,5);        map.put(3,4);        // 遍历hashmap entry foreach        Set> ent = map.entrySet();        for(Map.Entry entry:ent){            System.out.println(entry.getKey()+"  :  "+entry.getValue());            //map.remove(0);        }        System.out.println();        // 通过keySet或者values()遍历        Set set = map.keySet();        for(Integer key:set){            System.out.println(key+"  --  "+map.get(key));        }        Collection set1 = map.values();        for(Integer val:set1){            System.out.println(val);        }        System.out.println();        // iterator原理是什么 通过iterator遍历map        Iterator> iter = map.entrySet().iterator();        while(iter.hasNext()){            Map.Entry entry = iter.next();            System.out.println(entry.getKey()+"  :  "+entry.getValue());            iter.remove();        }        System.out.println();        Iterator keys = map.keySet().iterator();        while(keys.hasNext()){            int k = keys.next();            System.out.println(k+" -- "+ map.get(k));        }    }}

    感谢你能够认真阅读完这篇文章,希望小编分享的"java中迭代map的方式有哪些"这篇文章对大家有帮助,同时也希望大家多多支持,关注行业资讯频道,更多相关知识等着你来学习!

    迭代 对象 元素 方法 接口 篇文章 方式 时候 原理 好处 就是 数组 更多 源代码 类型 行为 剩余 原始 东西 也就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 测绘网络安全管理措施 海事局网络安全会议 大数据和软件开发哪个好就业 档案数据库怎么创建 网络技术工程师电子邮件故障排除 运用网络技术授课的方法 上海速排互联网科技中心怎么样 加强冬奥会期间网络安全 国六网络安全新政 社交安卓软件开发 成华区于素秋网络技术工作室 vb连接sql数据库语法 服务器风扇声 数据库技术的测试题 okit数据库 互联网金融科技公司名单 学校网络安全宣传单 网络安全80词英语作文 奉贤区真实软件开发 泰瑞亚手游新手怎么建服务器 java软件开发的编程思路 网络安全应急的培训 阿里云服务器资源不足导致掉线 手机邮箱需要电脑连接服务器吗 规范网络安全工作推动会 原始数据库一定要存放在()下 计算机网络安全隐患解决策略 校园网络安全手抄报简单版 怎么获得我的世界服务器控制台 网络安全主题宣传海报
    0