java容器:Collection中的Iterator和Map中的entrySet对比学习

使用Iterator(迭代器)来遍历容器的元素(List/Set/Map),总结遍历各种容器的方法 使用Iterator(迭代器)来遍历容器的元素(List/Set/Map) 其中遍历Map的时候有两种方式,第一种是调用Map的entrySet()方法,返回的是一个Set<Map.Entry<xxx,xxx>> a = xx.entrySet(),然后使用for(Iterator<Map.Entry<xxx,xxx>> aa =a.iterator... 阅读详情

对于和我一样的初学者,请参考我的前篇博文:java四器之迭代器初学:
http://blog.youkuaiyun.com/managementandjava/article/details/51404884
和git@code.youkuaiyun.com:snippets/1691286.git
一起学习,希望对初学者有一定的帮助,共勉!

package com.Collection;

import java.util.*;

/*需求分析:
 *  本次练习来对比学习Collection容器和Map集合的取出元素的两种方式:
 * 
 * 1.在Collection中我们是通过迭代器来取出元素,
 *  1.1实例见类IteratorForList
 *  1.2其内部实现原理:见注释
 *  1.3仿造内部原理构建自己的迭代器;
 * 2.在Map集合中我们通过 keySet()和entrySet()方法取出元素
 *  2.1 Set<K> keySet()
 *          ---->通过keySet()方法把所有的键值放到一个Set集合中,
 *          --->>再通过Set集合的迭代器和map的get(Object k)得到所有的值;
 *          --->>实例见:KeySetForMap类
 *  2.2 Set<Map.Entry<K,V>> entrySet():  返回此映射中包含的映射关系的 Set 视图
 *          --->>通过entrySet()把键和值的映射关系放入Set集合中,
 *          --->>这种映射关系就用Map.Entry来表示;
 *          --->>根据这种关系来取出相应的键和值;
 *          --->>实例见:EntrySetForMap
 *  2.3分析Map.Entry接口内部实现形式:
 *          --->>见注释部分的示例2.3;
 * */

/*  1.2实例
 *  interface Iterable<T>{
        public Iterator<T> iterator();
    }

    interface Iterator<E>{
        public boolean hasNext();
        public E next();
    }
    interface Collection<E> extends Iterable<E>{
        public Iterator<E> iterator();
    }

    interface List<E> extends Collection<E>{
         Iterator<E> iterator();
    }

    class ArrayList<E> implements List<E>{

         public Iterator<E> iterator() {
                return new Itr();
         }
         private class Itr implements Iterator<E> {
                int cursor;       // index of next element to return
                int lastRet = -1; // index of last element returned; -1 if no such
                int expectedModCount = modCount;
                public boolean hasNext() {
                    return cursor != size;
                }
                public E next() {
                    checkForComodification();
                    int i = cursor;
                    if (i >= size)
                        throw new NoSuchElementException();
                    Object[] elementData = ArrayList.this.elementData;
                    if (i >= elementData.length)
                        throw new ConcurrentModificationException();
                    cursor = i + 1;
                    return (E) elementData[lastRet = i];
                }
         }
    }

    因此当我们:
        List<String> infoList = new ArrayList<String>(list);

        //通过迭代器取出元素并代用next和hasNext方法是否实际上是调用的ArrayList实现的内部类中的方法;
        Iterator<String> it = infoList.iterator();

        while(it.hasNext()){
            String element = it.next();
            System.out.print(element+" ");
        }
    类此与这样的设计结构我们也可以定义我们自己的迭代器和数据集合结构:1.3



//示例2.3:分析Map.Entry源代码:
 public interface Map<K,V> {
     interface Entry<K,V> {
         K getKey();
         V getValue();
         //其他方法省略
     }
 }
 分析:为什么定义成内部接口;因为Entry表示的是Map键值对之间的映射关系;
 而这种关系是建立在Map集合的基础上;

 其实现必然也是外部类实现Map接口,内部类实现Map.Entr接口来操作的;
 public class HashMap implements Map{

    static class Node implements Map.Entry{

    }
 }

看HashMap中实现的源代码 必然是从内部类来实现的;
 //简化如下:
 class HashMap{

    //第一步:让一个静态内部类实现Map.Entry接口中的所有方法;
    static class Node<K,V> implements Map.Entry<K,V> {
        //定义节点Node的构造器。实现Entry接口中的方法;
    }
    //当我们想要调用entrySet()方法拿到映射关系的集合,并且想通过集合对象
    //(键值之间的关系)来取得相应的键和值时,
    //拿到映射关系的集合:通过EntryIterator的next()方法来拿到关系对象;
    //这就和ArrayList中的迭代器实现原理相似:如下
    public Set<Map.Entry<K,V>> entrySet() {
        //返回一个新的类 即: EntrySet类;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
    }
    final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
        //返回一个新的类 即: EntryIterator类
        public final Iterator<Map.Entry<K,V>> iterator() {
            return new EntryIterator();
        }
    }
    abstract class HashIterator {
        //定义了自己的构造器和hasNext(); Node<K,V> nextNode(); remove()方法;
        final Node<K,V> nextNode() {
            return e;
        }
     }  
     final class EntryIterator extends HashIterator implements Iterator<Map.Entry<K,V>> {
        public final Map.Entry<K,V> next() { return nextNode(); }
    }   

 }


*/
//1.1实例
class IteratorForList{
    public static void showElement(){
        String[] infoes =("hello java wo should say hello to the world").split(" ");
        List<String> list = Arrays.asList(infoes);
        List<String> infoList = new ArrayList<String>(list);

        //通过迭代器取出元素
        Iterator<String> it = infoList.iterator();
        while(it.hasNext()){
            String element = it.next();
            System.out.print(element+" ");
        }
    }

}

//1.3实例
interface MyIterable<E>{
    MyIterator<E> myIterator();
}
interface MyIterator<E>{
    public boolean hasPre();
    public E previous();
}
class MyList implements MyIterable<String>{

    String[] infoes = "hello java : wo should say hello to the world !!".split(" ");

    @Override
    public MyIterator<String> myIterator() {
        return new MyIter();
    }
    private class MyIter implements MyIterator<String>{
        int count=infoes.length;
        @Override
        public boolean hasPre() {
            if(count-->0)
                return true;
            return false;
        }
        @Override
        public String previous() {
            return infoes[count];
        }
    }
}

//2.1+2.2所需的资源对象;
class StuInfo{
    public static Map<Integer,String> showInfo(){
        Map<Integer,String> stuInfo  = new HashMap<Integer,String>();
        stuInfo.put(101, "xiaoming");
        stuInfo.put(102, "xiaoHua");
        stuInfo.put(103, "xiaoGuo");
        stuInfo.put(104, "xiaoWeng");
        stuInfo.put(105, "xiaoLv");

        return stuInfo;
    }
}
//2.1实例
class KeySetForMap{
    public static void showElement(){
        Map<Integer,String> stuInfo = StuInfo.showInfo();
        Set<Integer> keySet = stuInfo.keySet();
        for(Iterator<Integer> it = keySet.iterator();it.hasNext();){
            Integer next = it.next();
            System.out.println("key: "+next+" value: "+stuInfo.get(next));
        }

    }



}
//2.2实例
class EntrySetForMap{
    public static void showElement(){
        Map<Integer,String> stuInfo = StuInfo.showInfo();
        //第一步拿到映射关系的集合
        Set<Map.Entry<Integer, String>> entrySet = stuInfo.entrySet();
        //用set容器的迭代器方式取出各个元素;
        for(Iterator<Map.Entry<Integer, String>> it = entrySet.iterator();it.hasNext();){
            //拿到每一个映射关系对象;
            Map.Entry<Integer, String> entry = it.next();
            //根据映射关系的getKey()和getValue()方法得到相应的键值对;
            System.out.println("key: "+entry.getKey()+" value: "+entry.getValue());
        }
    }
}

//main:
public class IteratorVsEntrySet {

    public static void main(String[] args) {
        //1.1演示实例
        //IteratorForList.showElement();

        //1.3演示实例
        /*MyIterator<String> mi = new MyList().myIterator();
        while(mi.hasPre()){
            System.out.print(mi.previous()+" ");
        }*/

        //2.1演示实例
        KeySetForMap.showElement();

        //2.2演示实例
        EntrySetForMap.showElement();

    }
}
OpenClaw 3.13 + Mac mini M4 集成 qmd 记忆存储:qmd embed 卡死 / 报错 sqlite-vec 不可用 终极解决教程 模型加速让 qmd 从国内镜像下载模型,避免网络超时;SQLite 扩展支持:修改 qmd 源码后,Bun 不再使用内置 SQLite,而是调用 Homebrew 安装的,该版本支持接口,可正常加载vec0.dylib向量扩展;OpenClaw 3.13 适配:核心逻辑与 OpenClaw 3.13 的 qmd 记忆调用逻辑完全兼容,无需额外调整;sqlite-vec 加载:qmd 自动通过sqlite-vec包获取vec0.dylib路径,调用完成向量扩展加载,实现高效向量搜索。 阅读详情

相关推荐

【后端】主流后端语言:JAVA、C、C++、GO、PYTHON

软件开发领域,语言本身在各自领域都有适用场景,有许多流行的编程语言可供选择,每种语言都有其独特的特点和适用场景。

wnm23的专栏 1万+

Map集合

Map   java.util.包下的  它与Collection集合是同一层次 将键映射到值的对象。一个映射不能包含重复的键;每个键最多只能映射到一个值。 Map与Collection的区别 1.Map集合存储的时候存储的两个  一个是Key  另外一个是Value  Collection存储就是一个值. 2.Map集合存储元素时使用的是put方法,Collection

时光代码 1697

土地利用数据从1972到2023:如何利用Landsat和Sentinel数据构建长期变化监测模型

本文详细解析了如何利用1972至2023年的Landsat和Sentinel遥感数据构建土地利用长期变化监测模型。通过多源数据融合策略、时间序列预处理流程和深度学习算法,实现高精度的土地利用分类与变化检测,为生态评估和城市规划提供科学依据。文章还探讨了验证方法和实际应用案例,展示了长期遥感数据在环境建模中的独特价值。

weixin_28720573的博客 443

黑马程序员_java基础7--Map和Collections和Arrays

------- android培训、java培训、期待与您交流! ---------- @@(day16)Map和Collections-Arrays工具类和其他对象*********************************************************************** /* Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。  1,

wzq330995030的专栏 949

别再只用三次多项式了!用MATLAB手把手教你搞定七次多项式轨迹规划(附完整代码)

本文详细介绍了七次多项式在轨迹规划中的优势与应用,通过MATLAB实现从理论推导到实际代码的全过程。相比传统的三次多项式,七次多项式能精确控制位置、速度、加速度和加加速度,实现更平滑的运动控制,特别适用于工业机器人和数控机床等高精度场景。文章包含完整的MATLAB代码示例和优化技巧,帮助工程师快速掌握这一高级轨迹规划方法。

weixin_30872337的博客 297

Python环境搭建和LabVIEW中的调用

本文主要介绍Python相关的环境搭建、Anaconda的使用以及在LabVIEW中调用Python的方法。

lvxisi的博客 6389

Java中Map的遍历

keySet、values和entrySet对于java中Map的遍历这里有三种方法,分别是以keySet、values和entrySet遍历。其实就是: entrySet()存放键值对,返回的为Set集合,Set 中的每个元素都是一个 Map.Entry 对象 keySet() 存放键,返回的为Set集合,Set里面的类型即key的类型 values()存放值,返回的为Collection集合,

quniMdejiangyou的博客 373

深入理解HanLP1.x,填平可能遇到的坑

提取指定数量的摘要。自定义词典为什么要单独领出来讲呢?因为在我们的业务开发中,可能分词的效果并不理想,需要定制自己的词库,索引更加常用。例如:小米su7特斯拉modelY比亚042025款6575767670908我们需要分出小米su72025款等词。我们分别看看用字典和不用字典的效果。

static_coder的博客 977

lambda函数——Collect使用(六)

/** * collect 收集的目的就是为了下一步的转换准备的 * 案例一 :收集某个属性到集合中 */ @Test public void test(){ List<Man> integers = Arrays.asList( new Man(1,"1",1.0), new Man(2,"2",2.0), new M...

qq_42719318的博客 1268

Office 365中的Assigned Access详细功能介绍

本文系统介绍了Office365中AssignedAccess功能的应用与管理。作为Windows系统的重要安全特性,AssignedAccess可将设备锁定为单应用模式,有效防范未授权访问。文章详细阐述了其核心功能、技术架构及配置方法,包括UWP/Win32应用支持、多用户配置、与AzureAD集成等。通过MicrosoftEndpointManager可实现批量部署和远程监控,适用于公共终端、零售设备等场景。该功能为企业数字化转型提供了安全、可控的终端管理方案,在保障数据安全的同时优化用户体验。

xueyunshengling的博客 226

不藏了!Wireshark 命令、捕获、过滤器大全分享给你

Wireshark,这款广受欢迎的开源网络协议分析工具,堪称网络管理员、网络安全专家和网络爱好者的“显微镜”!它可以帮助我们捕获网络中的数据包,并提供详细的解码和分析能力。本文将为您全面剖析 Wireshark 的强大功能,从基础到高级,让你快速掌握这个神器!💡Wireshark 是一款功能强大的网络协议分析器,最早由 Gerald Combs 于 1998 年开发,经过多年发展,已成为网络诊断和分析的首选工具。

网络技术联盟站 724

Map集合的entrySet和keySet

List<Student> ls=new ArrayList<>(); Student s1 = new Student("小龙女", 23); Student s2 = new Student("任盈盈", 24); //Student s3 = new Student("小龙女", 23); Studen...

奔跑入坑大数据 452

ConvNeXt 改进 :ConvNeXt添加GnConv递归门控卷积,二次创新CNBlock结构 ,独家首发

视觉 Transformer 在多种任务中取得了显著的成功,这得益于基于点积自注意力的新空间建模机制。视觉 Transformer 中的关键因素——即输入自适应、长距离和高阶空间交互——也可以通过卷积框架高效实现。作者提出了递归门控卷积(Recursive Gated Convolution,简称 gnConv),通过门控卷积和递归设计执行高阶空间交互。该新操作具有高度的灵活性和可定制性,兼容各种卷积变体,并将自注意力中的二阶交互扩展到任意阶数,而不会引入显著的额外计算。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 233

Map集合的entrySet()方法

之前学习集合的时候要通过迭代器来迭代的时候最难得就是map集合得迭代,一直也不太明白,今天总算搞懂了首先我们看什么容器才能迭代根据API我们得知是对所有collection迭代的集合,那么已知的collection容器有哪些我把常用的标出了,我们接着看这些能容器如何迭代我们点进去,发现了collection容器有两种情况第一:拥有一个返回类型为Iterator的方法,我们通过这个方法得到迭代器第二...

Sunmeok的博客 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

关于Map遍历和Iterator的keySet和entrySet

最近在写配置文件方面的程序,原本打算用map来存储相应的数据对,

A_Abg的专栏 3856

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

map.entrySet().iterator()

原文链接: https://www.cnblogs.com/lxqiaoyixuan/p/7156944.html https://www.cnblogs.com/zzzzw/p/4945915.html 迭代器(Iterator)   迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小...

weixin_40486739的博客 4471

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

java数组、容器遍历方式对比,for i、for each、Iterator

java数组、容器遍历方式对比,for i、for each、Iterator 博客地址 源码地址 1. 先上结论 容器 for i for each Iterator array ● ● ○ List ● ● ● Set ○ ● ● Map ○ ● ● for each支持所有容器,只能遍历全部。优先使用。 List支持所有遍历方式,array不支持Iterator(能不用则不用),Set、Map不支持for i Map优先使用EntrySet方式遍历,因为: [外链图片

【小石头的茅坑】 71万+

Java集合-使用Iterator迭代器遍历List_Set_Map和容器遍历方法汇总

使用Iterator迭代器遍历 1. 使用Iterator迭代器遍历List、Set、Map import java.util.*; public class IteratorTest { public static void main(String[] args) { iteratorList(); iteratorSet(); iteratorMap(); } /** * 通过迭代器Iterator遍历list

baidu_38126306的博客 775

Java容器collection学习(二)

容器(二)六.迭代器使用Iterator迭代器遍历容器元素(List/Set/Map)迭代器遍历List迭代器遍历Set迭代器遍历Map(一)迭代器遍历Map(二) 六.迭代器 使用Iterator迭代器遍历容器元素(List/Set/Map) 迭代器为我们提供了统一的遍历容器的方式 迭代器遍历List public static void testIteartorList() { List...

弟弟的博客 181

Java_Iterator迭代器遍历容器元素

迭代器为我们提供了统一的遍历容器的方式,参见以下示例代码: 迭代器遍历List: public class Testl { public static void main(String[] args) { List<String> aList = new ArrayList<String>(); for (int i ...

赵广陆 948

Java基础(18):集合(容器)—Collection和Map两大体系介绍和用法

集合类的作用 集合类也叫做容器类,和数组一样,用于存储数据,但数组类型单一,并且长度固定,限制性很大,而集合类可以动态增加长度。集合存储的元素都是对象(引用地址),所以集合可以存储不同的数据类型,但如果是需要比较元素来排序的集合,则需要类型一致。集合中提供了统一的增删改查方法,使用方便。支持泛型,避免数据不一致和转换异常,还对常用的数据结构进行了封装。 集合框架体系的组成 集合框架体系是

我只是个程序员。 1247

Iterator迭代器的使用,对for和while对集合遍历并排以及java遍历map的方式

迭代器(Iterator)   Java中的Iterator功能比较简单,并且只能单向移动:   (1) 使用方法iterator()要求容器返回一个Iterator。第一次调用Iterator的next()方法时,它返回序列的第一个元素。注意:iterator()方法是java.lang.Iterable接口,被Collection继承。   (2) 使用next()获得序列中的下一个元素。  ......

Restless Breeze 3810

java 迭代器Iterator详解

java 迭代器Iterator详解 迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小。 (一)Iterator在Collection接口中的使用。    虽然Collection接口的相关类实现了get()方法,但将Iterator用在它们身上仍然是合适的,下面以ArrayList为例,讨论...

weixin_44026997的博客 1147

Map:遍历与删除

1.遍历Map: (1)通过map.keySet()拿到key,需要获取value,再通过key获取value。一般有两种写法,一种是使用iterator遍历,一种是直接遍历。示例代码如下: //直接遍历 for (String key : mHashMap.keySet()) { value = mHashMap.get(key); } //iterator遍历 for(Iterator...

赵小样Jasmine的博客 1万+

Iterator底层实现以及Map使用迭代器式的遍历(13)

前言 今天的南京,风云突变,上午风和日丽,下午乌云密布!大概像这样 “风急天高猿啸哀,渚清沙白鸟飞回。无边落木萧萧下,不尽长江滚滚来...” 咳咳咳,抱歉,此时此景,只想吟诗一首! 身为一个有抱负的技(dou)术(bi) 博主,今天依然给大家带来一篇关于Iterator底层实现的博客!这是一篇短小精悍、浅显易懂、深入浅出、博大精深、牛皮哄哄的博客!好了,...

帅哥威的博客 1014

java学习笔记之使用Iterator迭代器遍历容器元素(List/Set/Map) 2019/5/9

使用Iterator迭代器遍历容器元素(List/Set/Map) 迭代器为我们提供了统一的遍历容器的方式 转载自 http://www.sxt.cn/Java_jQuery_in_action/nine-ergodicset.html 【示例1】使用Iterator迭代器遍历容器元素(List/Set/Map) public class Test { public static void ma...

superpan的博客 363
上一篇: java设计模式:代理模式
下一篇: java内存分配问题初学
Coder-Qian
博客等级 码龄11年 63粉丝 73原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值