Map简介_介绍一下map-程序员宅基地

技术标签: Java  


Map 是一组成对的“键值对”对象,允许使用键 (key) 来查找值 (value)。它提供了一个映射表,可以通过某个对象来查找另一个对象。它也被称作 关联数组,因为它将某些对象与另外一些对象关联在一起;或者称作 字典,通过键对象来查找值对象,就像在字典中使用单词来定义一样。

Map 基本特性:

  • 以 key-value 键值对的形式存储数据,可通过 key 来查找 value;
  • 对于每一个 key,Map 只接受存储一次;
  • 通过 put(key,value) 方法添加一个值,通过 get(key) 方法获取与这个键关联的值。

Map 接口框架图如下:

在这里插入图片描述

其中最常见的实现类就是 HashMap,介绍一波。

HashMap

HashMap 基于哈希表实现,不保证存储顺序,具体使用看代码:

 public static void main(String[] args) {
        //通过 HashMap 创建 map 对象
        Map<String, String> map = new HashMap<>();
        //向 Map 添加键值对
        map.put("a", "rat");
        map.put("b", "cat");
        map.put("b", "dog");
        map.put("c", "rat");
        map.put(null, null);
        map.put(null, null);
        //map 打印
        System.out.println("map: " + map);

        System.out.println("map 中是否有键 a: " + map.containsKey("a"));
        System.out.println("map 中是否有值 null: " + map.containsValue(null));
        System.out.println("map 中 a 的值为:" + map.get("a"));
        map.remove(null);
        System.out.println("删除 null 后的map:" + map);
    }

打印结果:

map: {null=null, a=rat, b=dog, c=rat}
map 中是否有键 a: true
map 中是否有值 null: true
map 中 a 的值为:rat
删除 null 后的map:{a=rat, b=dog, c=rat}

  • 代码中通过 put(key, value) 方法向 Map 中添加键值对,如果对同一个 key 执行多次 put 操作,会修改 Map 中与该 key 关联的 value,Map 会保留最后一次 put 的值;
  • Map 中的 key 和 value 都可以是 null,并且只保留一个为 null 的 key;
  • Map 有自己默认的打印行为,用大括号括住,键值之间有等号(键在等号左边,值在右边);
  • containsKey(key) 和 containsValue(value) 方法来判断 Map 中是否存在键或值;
  • get(key) 方法用来获取与 key 对应的 value 值。
  • remove(key) 方法可以删除 Map 中与该 key 相关的映射。

TreeMap

TreeMap 是基于红黑树实现,用来保存一个有序的键值对 (key-value) 集合,有两种排序方式,默认是自然排序,还可以定制排序。先看自然排序:

public static void main(String[] args) {
        //通过 TreeMap 创建 map 对象
        Map<String, String> map = new TreeMap<>();
        //向 Map 添加键值对
        map.put("rat", "bob");
        map.put("cat", "sam");
        map.put("dog", "tim");
        System.out.println(map);
    }

打印结果:

{cat=sam, dog=tim, rat=bob}

可以看出结果是有序的,并且按照自然排序规则。如果不希望是自然排序,那么就可以定制排序:

public static void main(String[] args) {
        //通过 TreeMap 创建 map 对象
        Map<String, String> map = new TreeMap<>(new Comparator<String>() {
            @Override
            public int compare(String o1, String o2) {
                //倒序
                return o2.compareTo(o1);
            }
        });
        //向 Map 添加键值对
        map.put("rat", "bob");
        map.put("cat", "sam");
        map.put("dog", "tim");
        System.out.println(map);
    }

打印结果:

{rat=bob, dog=tim, cat=sam}

以匿名内部类的方式在有参构造器 TreeMap(Comparator comparator) 中传入 Comparator 参数,重写其中的 compare() 方法,按照倒序返回,结果如期而至,Map 的 key 都是倒序输出。

Map 的遍历

Map 是以键值对的方式来存储,那么只要获取所有的键 (key) 的集合,然后通过遍历键的集合去获取所有的值 (value),就完成了对 Map 的遍历,代码如下:

public static void main(String[] args) {
        //通过 HashMap 创建 map 对象
        Map<String, String> map = new HashMap<>();
        //向 Map 添加键值对
        map.put("a", "rat");
        map.put("b", "cat");
        map.put("b", "dog");
        map.put("c", "rat");
        map.put(null, null);
        map.put(null, null);

        //通过 keySet 方法返回所有键组成的 set
        Set<String> keys = map.keySet();
        //遍历 map
        for (String key : keys) {
            System.out.println("key:" + key + ",value:" + map.get(key));
        }
    }

打印如下:

key:null,value:null
key:a,value:rat
key:b,value:dog
key:c,value:rat

通过 Map 的 keySet() 方法获取所有键的 Set,然后通过 foreach 语句来遍历整个 Map。keySet() 方法只能获取键的 Set,Map 还有一个 entrySet() 方法,可以获取所有的键值对,然后直接遍历,这下就省事了:

public static void main(String[] args) {
        //通过 HashMap 创建 map 对象
        Map<String, String> map = new HashMap<>();
        //向 Map 添加键值对
        map.put("a", "rat");
        map.put("b", "cat");
        map.put("b", "dog");
        map.put("c", "rat");
        map.put(null, null);
        map.put(null, null);

        //获取 map 的所有键值对
        Set<Map.Entry<String, String>> entries = map.entrySet();
        //遍历 map
        for (Map.Entry<String, String> entry : entries) {
            System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
        }
    }

打印结果就不贴出来了,如上。上述代码使用的是 foreach 语法,使用迭代器也是可以的,创建迭代器的代价较小,因此这是个比较常用的方式,迭代器后面会做详细介绍,这里简单展示迭代器在 Map 遍历中的使用:

 public static void main(String[] args) {
        //通过 HashMap 创建 map 对象
        Map<String, String> map = new HashMap<>();
        //向 Map 添加键值对
        map.put("a", "rat");
        map.put("b", "cat");
        map.put("b", "dog");
        map.put("c", "rat");
        map.put(null, null);
        map.put(null, null);

        //获取 map 的所有键值并生成迭代器对象
        Iterator<Map.Entry<String, String>> iterator = map.entrySet().iterator();
        //map 遍历
        while (iterator.hasNext()) {
            Map.Entry<String, String> next =  iterator.next();
            System.out.println("key:" + next.getKey() + ",value:" + next.getValue());
        }
    }

小结

本文介绍了 Map 的两个实现类 HashMapTreeMap,两者都是非线程安全的类。HashMap 适用于 Map 中插入、删除和定位元素,速度较快,建议多使用,如果需要排序的时候再使用 TreeMap。 文章还介绍三种 Map 的遍历方式,其中迭代器的方式比较常用,后面的章节会对迭代器做更详细的介绍。

欢迎关注公众号:柯妞妞

在这里插入图片描述

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/f381226200/article/details/94317254

智能推荐

python卷积神经网络cnn的训练算法_基于TensorFlow的比较研究:卷积神经网络(CNN)优化算法...-程序员宅基地

文章浏览阅读901次。用于训练神经网络的最受欢迎的优化算法有哪些?如何比较它们?本文试图用一个卷积神经网络(CNN)来回答这些问题。随机梯度下降(SGD)SGD通过选取大小(m)的子集或小批量数据,更新在梯度(g)的反方向上的模型参数(g):神经网络由 f(x(i); theta)表示;其中x(i)为训练数据,y(i)为训练标签,损失L的梯度是根据模型参数theta计算的。学习速率(eps_k)决定了算法沿着梯度的步长..._python卷积神经网络cnn的训练算法

linux edt时间转成cst时间,edt时间和北京时间换算(edt时间 现在)-程序员宅基地

文章浏览阅读9.3k次。1:05 AM EDT:1:05 AM Eastern Daylight Time 也就是美国东部夏季时间凌晨1点零5分。换算北京时间是:14:05,下午2点5分,日期是本日,没有改变。(美国冬令时)13:.GMT是0的话,北京时间+8小时,EDT-5小时 所以北京时间是EDT延后的13小时,GMT延后的8小时解答如下:美国时间9月19日09:00am EDT是北京时间9月19日21:00pm注:..._mon mar 18 23:20:47 edt 2024同步北京时间

计算机直流仿真实验 原理图,本科毕业设计-vm不可逆双闭环直流调速系统课程设计正文.doc...-程序员宅基地

文章浏览阅读774次。本科毕业设计-vm不可逆双闭环直流调速系统课程设计正文广西工学院鹿山学院电力拖动自动控制系统课程设计设计题目:V-M不可逆双闭环直流调速系统系 别:电子信息与控制工程系专业班级:自动化091姓 名:刘帅学 号日 期:2012年6月5日内容摘要电力拖动自动控制系统是把电能转换成机械能的装置,它被广泛地应用于一般生产机械需要动力的场合,也被广泛应用于精密机械等需要高性能电气传动的设备中,用以控制位置、..._不可逆v-m双闭环直流调速系统设计

go语言消息推送服务器,用Go语言实现推送服务器.pdf-程序员宅基地

文章浏览阅读490次。用Go语言实现推送服务器用Go语言实现推送服务器陈叶皓 chen.yh@议程• 推送服务器介绍• Golang特点• 推送服务架构• 部分代码• 上线效果议程• 推送服务器介绍• 推送服务架构• 部分代码• 上线效果什么是推送服务器• 推送业务信息到手机端• 始终保持连接推送服务器要求• 高并发• 可靠性• 高性能• 支持水平扩展• 无单点故障Go语言特性• 静态..._go push server 架构方案

asp.net webform 使用 html partial,asp.net-mvc – 使用@ Html.Partial渲染usercontrol(cshtml)-程序员宅基地

文章浏览阅读124次。我正在接触MVC 3并且很困惑我如何在我的项目中使用UserControls.我创建了一个名为UserControl.cshtml的usercontrol(cshtml)文件,我正在尝试将其呈现为Products.cshtml.MyUserControl.cshtml位于Shared文件夹中.在Products.cshtml中:@Html.Partial("MyUserControl.cshtml..._asp.net webusercontrol重新渲染

【产品经理学习笔记】Part 9 交互设计(1)_产品交互设计题-程序员宅基地

文章浏览阅读1.1k次。交互设计(一)交互设计-图形界面设计格式塔理论1. 相似性2. 接近性3. 连续性4. 闭合性5. 图/地法则(主体与背景法则)6. 简单法则(Pragnanz)7. 共同命运法则视觉感知流程:人是如何获取界面上的信息的(二)交互设计-人机交互界面的视觉感知亮度感知色彩感知景深感知(三)交互设计-认知摩擦认知摩擦如何降低认知摩擦(四)交互设计-认知负荷认知负荷外在认知负荷内在认知负荷控制外在认知..._产品交互设计题

随便推点

java将png显示到界面_如何在java面板中显示图片~~面板代码如下-程序员宅基地

文章浏览阅读167次。packageactin;importjavax.swing.JFrame;importjavax.swing.JPanel;importjavax.swing.JTabbedPane;publicclassTestPanelextendsJFrame{JTabbedPanecontainer;publicTestPanel(){supe...package actin;import javax...._java怎么添加png图片

python telnet登录发送命令_telnet 登录测试产品,自动发送测试命令,匹配返回的python脚本...-程序员宅基地

文章浏览阅读514次。备注:telnetdo的代码来自网络,表示非常的感谢!自己根据实际的工作需要,增加了一小点东西,也分享希望有用的人可以拿去使用。========================================总共贴3个部分:第一个部分是修改后可以直接进行telnet登录测试的Python脚本。第二部分是为了测试失败或成功,在控制台显示带颜色的提示信息的Python代码,同样来自网络。第三部分是为了..._python telnet 如何判断是否成功

hadoop-2.10.0部署_win10 +hadoop2.10.0-程序员宅基地

文章浏览阅读3.4k次,点赞3次,收藏5次。下载hadoop我这里是下载的 hadoop-2.10,从北京理工大学开源软件镜像,官网下载你懂得…地址: http://mirror.bit.edu.cn/apache/hadoop/下载完成后解压, tar -xzvf hadoop-2.10.0.tar.gz,这里我将hadoop直接放在加目录下。 伪分布配置配置hadoop配置文件路径在 hadoop目录/etc/hadoo..._win10 +hadoop2.10.0

matlab半实物仿真,半实物仿真系统及半实物仿真方法-程序员宅基地

文章浏览阅读1.1k次。半实物仿真系统及半实物仿真方法【技术领域】[0001] 本申请涉及仿真技术领域,更具体的说是涉及一种半实物仿真系统及半实物仿真 方法。【背景技术】[0002] 半实物仿真是指将实物引入仿真环境中进行仿真的技术,这样就避免了全数字仿 真中,由于为实物建立的数学模型的正确性所带入的误差,从而可大大提高仿真的可信度。[0003] 在半实物仿真的仿真环境下,涉及到对实物设备的设备控制操作,例如上下电、归 ..._matlab 半实物仿真

Lvs+keepalived实现负载均衡、故障剔除(DR模式)_keepalived + lvs 无法平均负载-程序员宅基地

文章浏览阅读298次。Lvs+keepalived实现负载均衡、故障剔除(DR模式)shanswei3人评论5502人阅读2009-10-22 11:54:48Node1: 192.168.1.253Node2: 192.168.1.254VIP: 192.168.1.250环境centos5.2(我这里是用两台机实现的)1、安装ipvsadmyum -y install ipvsadm2、安装keepalived[root@node1 ~]# wget ht..._keepalived + lvs 无法平均负载

推荐文章

热门文章

相关标签