【Java学习笔记】Map接口

javaSE集合框架(二)—— Map接口 集合框架中的Map接口 阅读详情

Map 接口

实现类

  • HashMap

    • LinkedHashMap(在 set 接口中的 HashSet 接口已经补充相关笔记)

  • TreeMap

  • Hashtable

    • Properties

1. 基本介绍

  • Map 与 Collection 并列存在(即二者无联系):用于存储具有映射关系的数据,形式为 Key-Value

  • Map 中的 key 和 value 可以是任何引用类型的数据,通常会封装到HashMap$Node对象中。

  • Map 中的 key 不允许重复,原因和 HashSet 一样(在 set 接口的笔记中分析过源码),但是 value 可以重复

  • Map 的 key 可以为 null,value 也可以为 null,注意 key 为 null,只能有一个键值对

  • Map 存放数据的 key-value 是存放在 HashMap$Node 中的,因为 Node 实现了 Entry 接口

  • 常用 String 类型作为 Map 的 key,key 和 value 之间存在单向一对一关系,即通过指定的 key 能找到对应的 value(get()方法)

2. Map 接口的常用方法

方法描述
put(K key, V value)将指定的键和值添加到 Map 中,若键已存在则更新对应的值。
get(Object key)根据指定的键返回对应的值,若键不存在则返回 null。
entrySet()返回 Map 中所有键值对的 Set 集合,每个元素为 Map.Entry 对象。
keySet()返回 Map 中所有键的 Set 集合。
values()返回 Map 中所有值的 Collection 集合。
remove(Object key)删除指定的键及其对应的值(通过键值删除键值对),返回被删除的值,若键不存在则返回 null。
replace(K key, V value)替换指定键的值,若键不存在,则不做任何操作。
replaceALL((k,v) -> v.equals(newvalue)?newvalue:oldvalue)指定所有键值对中的 oldvalue 替换成 newvalue
replaceALL((k,v) -> newvalue)把所有的键值对中的 oldvalue 替换成新的 newvalue
containsKey(Object key)检查 Map 是否包含指定的键,返回 true 或 false。
containsValue(Object value)检查 Map 是否包含指定的值,返回 true 或 false。
size()返回 Map 中键值对的数量。
isEmpty()检查 Map 是否为空,若为空返回 true,否则返回 false。
clear()清空 Map 中的所有键值对。

3. Map 接口的底层分析

(1)每一对 键值对 会存储在 HashMap 的内部 table 数组中(table 数组的类型是 HashMap$Node[])。table 数组中的每个位置存储的是一个 Node 对象

每个 Node 对象封装了四个属性

  • key

  • value

  • hash

  • next

说明:HashMap$Node 是 Node 的全名,表示它是 HashMap 类的一个内部类。在 Java 中,$ 是用于区分内部类和外部类的符号

结论:HashMap$Node 是 Node 类的全限定名

(2)由于HashMap$Node implements Map.Entry,这个接口提供了getKey()和 getValue()方法,方便接口的遍历

  • EntrySet:entrySet 是 Map 接口的一个方法,返回一个Set<Map.Entry<K,V>> 集合,集合的名字叫做 EntrySet

    • 集合的类型是 Set

    • 集合中每个元素的类型是 Map.Entry

  • 存放不同的Entry对象,封装了一个键值对

    • key

    • value

  • EntrySet 集合中每个 Entry 元素中的 key 被封装成 KeySet 集合(类型是 Set)

  • EntrySet 集合中每个 Entry 元素中的 value 被封装成 Values 集合(类型是 Collection)

  • 最终通过引用把 table 数组中存储的每个 Node 节点中的 key 和 value 指向 KeySet 集合和 Values 集合

  • 注意:本质上 Key - Value 键值对还是存储在 table 数组 Node 节点中(即本质上entry 对象的==运行类型=还是HashMap$Node),这里只是作为引用传递,而不是存储在封装的集合中

内存视图证明

请添加图片描述

EntrySet 集合的结构

请添加图片描述

代码示例

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

@SuppressWarnings("all")
public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1","jack");
        map.put("2","tom");
        map.put("3","lucy");

        Set set = map.entrySet();
        System.out.println(set.getClass());

        Set set1 = map.keySet();
        System.out.println(set1.getClass());

        Collection set2 = map.values();
        System.out.println(set2.getClass());
    }
}

// 运行结果
class java.util.HashMap$EntrySet
class java.util.HashMap$KeySet
class java.util.HashMap$Values

注意:getClass()方法返回的是运行类型


Map 接口的遍历

思路概括(核心是理解 Map 接口的底层机制)

  • entrySet() 方法:提取每一对键值对

    • EntrySet 集合是双元素集合

    • map.entrySet()方法返回的是一个 Set<Map.Entry<K, V>> 类型的集合,包含多个 Map.Entry 对象(每个对象包含key 和 value两个值)

    • 即返回的集合是单元素集合,可以用迭代器遍历

  • keySet() 方法:提取所有的 key(单元素集合)

  • values() 方法:提取所有的 value(单元素集合)

注意:对于单元素集合可以使用的遍历方式

  • 增强 for 循环

  • 迭代器(只适用单元素)

第一组:遍历 key

思路如下

  • 首先通过 map.keySet()方法提取键值对中的键值

  • 然后通过遍历 keySet 数组获取键值对中的键值

方法一:增强 for 循环

public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1", "jack");
        map.put("2", "tom");
        map.put("3", "lucy");

        Set set = map.keySet();
        for (Object key : map.keySet()) {
            System.out.println("键:" + key);
        }
    }
}

键:1
键:2
键:3

方法二:迭代器(keySet 是单一元素集合)

public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1", "jack");
        map.put("2", "tom");
        map.put("3", "lucy");

        Set set = map.keySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object key =  iterator.next();
            System.out.println("键:" + key + " --> " + "值:" + map.get(key));
        }
    }
}

// 输出结果
键:1
键:2
键:3

第二组:遍历 value

思路如下

  • 首先通过 map.values()方法提取键值对中的值

  • 然后通过遍历 values 数组获取键值对中的值

方法一:增强 for 循环

public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1", "jack");
        map.put("2", "tom");
        map.put("3", "lucy");

        Collection set = map.values();
        for (Object values :set) {
            System.out.println("值:" + values);
        }
    }
}

// 输出结果
值:jack
值:tom
值:lucy

方法二:迭代器

public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1", "jack");
        map.put("2", "tom");
        map.put("3", "lucy");

        Collection set = map.values();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object values =  iterator.next();
            System.out.println("值:" + values);
        }
    }
}
// 输出结果
值:jack
值:tom
值:lucy

第三组:遍历 key - value

思路一:结合 map 接口中的 get()方法,通过 key 来获取对应的 value,通过字符串拼接来得到键值对

补充说明:由于 Map 接口的特点,key 值不可以有相同的,但是不同 key 的 value 可以是相同的,若通过 value 来遍历 key 就会造成不确定性,这个无法实现的,但是可以通过map.values()方法来遍历 value 的值

思路二:通过 entryset()方法,得到每个 entry 对象,之后通过实现接口中的getKey()和 getValue()方法来获取键和值

思路一:调用 get() 方法

方法一:增强 for 循环

public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1", "jack");
        map.put("2", "tom");
        map.put("3", "lucy");

        Set set = map.keySet();
        for (Object key : map.keySet()) {
            System.out.println("键:" + key + " --> " + "值:" + map.get(key));
        }
    }
}

// 输出结果
键:1 --> 值:jack
键:2 --> 值:tom
键:3 --> 值:lucy

方法二:迭代器

public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1", "jack");
        map.put("2", "tom");
        map.put("3", "lucy");

        Set set = map.keySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object key =  iterator.next();
            System.out.println("键:" + key + " --> " + "值:" + map.get(key));
        }
    }
}

// 输出结果
键:1 --> 值:jack
键:2 --> 值:tom
键:3 --> 值:lucy

思路二:调用 entryset() 方法(需要使用向下转型)

方法一:增强 for 循环

public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1", "jack");
        map.put("2", "tom");
        map.put("3", "lucy");

        Set set = map.entrySet();
        for (Object obj :set) {
            // 向下转型
            Map.Entry entry =(Map.Entry) obj;
            System.out.println("键:" + entry.getKey() + " --> 值:" + entry.getValue());
        }
    }
}

// 输出结果
键:1 --> 值:jack
键:2 --> 值:tom
键:3 --> 值:lucy

方法二:迭代器


public class pra {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("1", "jack");
        map.put("2", "tom");
        map.put("3", "lucy");

        Set set = map.entrySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()) {
            Object obj =  iterator.next();
            Map.Entry entry = (Map.Entry)obj;
            System.out.println("键:" + entry.getKey() + " --> 值:" + entry.getValue());
        }
    }
}

HashMap

(1)HashMap 是 Map 接口中使用频率最高的实现类

(2)HashMap 是以 key - value 对的方式存储数据的(HashMap$Node 类型)

(3)key 不能重复, 但是值可以重复, 允许使用 null 键和 null 值,key 的 null 值只能有一个

(4)如果添加相同的 key, 则会覆盖原来的 key-val, 等同于修改. (key 不会替换, val 会替换)

(5)与 HashSet 一样, 不保证映射的顺序, 因为底层是以 hash 表的方式来存储的. (jdk8 的 hashMap 底层是 数组 + 链表 + 红黑树)

(6)HashMap 没有线程同步, 因此是线程不安全的, 方法没有做同步操作, 没有 synchronized.

关于 HashMap 的底层添加机制和扩容机制在 Set 接口中的 HashSet 中已经分析,这里重点看一下如果添加键值相同时,value 是如何被替换的

源码如下

if (e != null) { // existing mapping for key
    V oldValue = e.value;
    if (!onlyIfAbsent || oldValue == null)
        e.value = value;
    afterNodeAccess(e);
    return oldValue;
}

前面的源码分析可以跳到 Set 接口的笔记:点我跳转

经过前面的判断,key 相同,则 e 指向的对象和 p 指向的对象相同(都是第一次添加的包含 key 的 Node 对象),此时 e 不为空,进入这个分支判断

分析:e.value = value,传进来的 value 赋值给了 p(即 e)指向的对象(即第一次添加的包含 key 的 Node 对象)的 value,完成了 value 的更新


Hashtable

基本介绍

(1)存放的元素是键值对:即 K-V

(2) Hashtable 的键和值都不能为 null,否则会抛出 NullPointerException 异常

(3) Hashtable 使用方法基本和 HashMap 一样

(4) Hashtable 是线程安全的 (synchronized)

(5)HashMap 是线程不安全的

HashMap 和 Hashtable 的对比

类型版本线程安全(同步)效率允许 null 键 null 值
HashMap1.2不安全高可以
Hashtable1.0安全低不可以

Properties

基本介绍

(1) Properties 类继承自 Hashtable 类并且实现了 Map 接口,也是使用一种键值对的形式来存储数据。

(2) 他的使用特点和 Hashtable 类似

(3) Properties 还可以用于从 xxx.properties 文件中,加载数据到 Properties 类对象,并进行读取和修改

(4) 说明:工作后 xxx.properties 文件通常作为配置文件,这个知识点在 IO 流举例中

说明:由于 Properties 类最主要的作用是实在文件的读取和操作上,更多介绍会在 IO 流中的笔记介绍,这里不做详述


TreeMap

基本介绍

和 TreeSet 一样,可以传入一个比较器来指定添加的顺序,不同的是 TreeMap传入的是键值对

源码分析(和 HashMap 的原理大致相同,这里说明不同的地方)

注意:TreeMap 是双列集合,不会进入add()方法,而是直接进入put()方法

进入 put() 方法

public V put(K key, V value) {
    Entry<K,V> t = root;
    if (t == null) {
        compare(key, key); // type (and possibly null) check

        root = new Entry<>(key, value, null);
        size = 1;
        modCount++;
        return null;
    }
    int cmp;
    Entry<K,V> parent;
    // split comparator and comparable paths
    Comparator<? super K> cpr = comparator;
    if (cpr != null) {
        do {
            parent = t;
            cmp = cpr.compare(key, t.key);
            if (cmp < 0)
                t = t.left;
            else if (cmp > 0)
                t = t.right;
            else
                return t.setValue(value);
        } while (t != null);
    }
    else {
        if (key == null)
            throw new NullPointerException();
        @SuppressWarnings("unchecked")
            Comparable<? super K> k = (Comparable<? super K>) key;
        do {
            parent = t;
            cmp = k.compareTo(t.key);
            if (cmp < 0)
                t = t.left;
            else if (cmp > 0)
                t = t.right;
            else
                return t.setValue(value);
        } while (t != null);
    }
    Entry<K,V> e = new Entry<>(key, value, parent);
    if (cmp < 0)
        parent.left = e;
    else
        parent.right = e;
    fixAfterInsertion(e);
    size++;
    modCount++;
    return null;
}

1. 第一次执行add()方法

Entry<K,V> t = root;
if (t == null) {
    compare(key, key); // type (and possibly null) check

    root = new Entry<>(key, value, null);
    size = 1;
    modCount++;
    return null;
}

代码分析

第一次添加,把 k- v 键值对封装到 Entry 对象中,放入 root

2. 之后的添加

Comparable<? super K> k = (Comparable<? super K>) key;
do {
    parent = t;
    cmp = k.compareTo(t.key);
    if (cmp < 0)
        t = t.left;
    else if (cmp > 0)
        t = t.right;
    else
        return t.setValue(value);
} while (t != null);

代码分析

(1)遍历所有的 key,给当前的 key-value 键值对找到插入位置

(2)调用传入的比较器,实现 compare 方法(动态绑定机制)

(3)else 分支:在遍历过程中,如果发现当前的 key 和添加的 key 一样,就不会执行添加操作

易错题

问题:下面代码中的java会被添加到 TreeMap 中吗

public class pra {
    public static void main(String[] args) {

        TreeMap treeMap = new TreeMap(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
                return ((String)o1).length() - ((String)o2).length();
            }
        });

        treeMap.put("jack","1");
        treeMap.put("tom","2");
        treeMap.put("hi","3");
        treeMap.put("java","4");

        System.out.println("treeSet = " + treeMap);
    }
}

答案:不会

输出结果

treeSet = {hi=3, tom=2, jack=4}

可以看到 jack 对应的value 做了更新

底层源码分析

do {
    parent = t;
    cmp = k.compareTo(t.key);
    if (cmp < 0)
        t = t.left;
    else if (cmp > 0)
        t = t.right;
    else
        return t.setValue(value);
} while (t != null);

由于传入的比较器是比较字符串的长度,当字符串的长度相同时,就会返回 0,进入 else 分支

  • 调用setValue()方法,把 key 对应的 value 做一个更新,返回这个 value

  • 函数遇到了 return 语句,函数退出

结论:遇到相同的 Keys 时,新的 key不会添加进入,但是会用新的 vlaue 替换旧的 value 值

Java Map接口详解 默认情况下,数组大小(DEFAULT_INITIAL_CAPACITY)为16,那么当HashMap中元素个数超过160.75=12(这个值就是代码中的threshold值,也叫做临界值)的时候,就把数组的大小扩展为216=32,即扩大一倍,然后重新计算每个元素在数组中的位置,而这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设元素的个数能够有效的提高HashMap的性能。Map中的key: 无序的、不可重复的 ,使用Set存储所有的key。// 1. key是null。. 阅读详情

相关推荐

手把手教你用OpenCalib完成激光雷达与相机联合标定:从数据准备到结果可视化

本文详细介绍了使用OpenCalib工具链中的lidar2camera模块完成激光雷达与相机联合标定的全流程,包括数据准备、标定命令执行、结果验证与可视化。通过实战指南,帮助读者掌握工业级标定技术,提升自动驾驶和机器人领域的传感器融合精度。

weixin_30872499的博客 400

Java的Map接口

Map接口简介 Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value Map 中的 key 和value 都可以是任何引用类型的数据。 Map 中的 key 用Set来存放,不允许重复,即同一个 Map 对象所对应的类,须重写hashCode()和equals()方法。 常用String类作为Map的“键”。 key 和 value 之间存在单向一对一关系...

爪哇菌的博客 3675

(侧边抽屉)移动端APP汉堡页设计全解:从规范落地到体验优化

汉堡页是一种隐藏式侧边导航组件,由汉堡图标(三条水平横线)、侧边抽屉面板、主界面遮罩层三部分构成。点击汉堡图标后,面板通常从左侧滑入,覆盖主界面部分区域(或悬浮于主界面之上);关闭时可通过点击关闭按钮、遮罩层、返回键或侧滑手势完成,是移动端特有的空间优化设计模式。

qq_67370502的博客 617

深入理解 Java 中的 Map 接口及其实现类

大家好,我是香香。之前给介绍了以及接口。今天我们介绍一个独立于 Collection 容器的集合 - Map。了解 Java 集合框架中的Map接口以及与之相关的一些实现类。

weixin_51109279的博客 932

中国高质量夜间灯光数据

中国高质量夜间灯光数据是CnOpenData与吉林高分遥感应用研究院有限公司合作的数据库 ,基于多源夜间灯光卫星遥感影像,经过科学手段对数据进行降噪、修正、分析统计,以年度、月度为更新频率,以省市县三级行政区划作为统计单元,制作高质量夜间灯光数据。

Sunny9qx的博客 3311

解决linux 2.5G网卡驱动问题

解决linux 2.5G网卡驱动问题 关键词:2.5G网卡驱动,ubuntu,安装,2.5G Ethernet LINUX driver,Realtek网卡驱动 由于2.5G网卡较新,各linux发行版的通用驱动已不适用,新装的系统会出现无法上网问题,由于国内网络环境去Realtek官网很难下载到驱动文件,故本文提供github上的2.5G Ethernet LINUX driver r8125 for kernel up to 5.6的版本驱动文件r8125-9.003.05.tar.bz2各位可以自

poorguy_aos的博客 1万+

Map接口 Java学习笔记

Map接口 <Java学习笔记> Map接口的简介: Map是一个映射集合,每个元素包含一个key-value(键-值对)。Map中的key(键)不可以重复,但value(值)可以重复; 但需要注意如果给一个key(键)指定多个value(值),那么key只会和载入的最后一个value形成(键-值对); //加载数据 ma.put("java", "书"); ...

weixin_45589276的博客 202

从零构建高精度电子秤:HX711与STM32的时序通信陷阱与实战避坑指南

本文详细解析了使用STM32F103C8T6与HX711模块构建高精度电子秤的通信时序陷阱与实战解决方案。重点探讨了微秒级延迟实现、数据读取算法、校准方法和滤波优化,帮助开发者避开常见通信问题,提升电子秤的测量精度和稳定性。

data3的博客 782

Java学习笔记——Set接口和Map接口

Set接口和Map接口 1.了解Set集合的特点 2.掌握Set集合下常用实现类的使用 3.了解Map集合的特点 4.掌握Map集合下常用实现类的使用 5.掌握Map集合的遍历方式 6.掌握Collections工具类 第一节 Set接口 1.1 Set接口常用方法 方法名 描述 ...

冷漠的小猿 4944

黑猫带你学eMMC协议第2篇:eMMC部分相关名词释义

1 前言 1.1 声明 本文依据eMMC JEDEC5.1、网络资料及个人工作经验整理而成,如有错误请留言。 本文结合eMMC JEDEC5.1协议手册查看效果更佳。 1.2 本文背景 本文关键词不包括emmc jedec5.1协议第3章节:《Terms and definitions》内容。关于emmc协议层的关键词,直接查阅spec相关章节即可,清晰明了,此处没必要再列出。 本文为本人工作学习中常听到或常用到关乎于emmc/flash的一些关键词合集,没有固定分类,不需要强行记忆,供查询使用。 1.

黑猫奥利奥的博客 7436

大数据平台符合信创(CDH国产化代替)详细方案(企业内部不外传方案)

信创旨在实现信息技术产业的自主可控,减少对外部技术的依赖,从而提升国家信息安全和经济发展的自主性。在此背景下,中国对信创提出了更高的要求,以期在激烈的市场竞争中占据有利地位。信创不仅关乎技术层面的创新,更涉及到产业链条的整合与优化。它要求从基础硬件、操作系统、数据库、中间件等各个层面实现国产替代,构建完整的信息技术生态体系。尤其是在做国企项目时,就有硬性要求使用符合信创(国产代替)。在信创背景下,符合要求的产品必须具备自主可控、安全可靠以及性能卓越等核心特点。

大模型大数据攻城狮的专栏 3510

java学习笔记 Map接口

一.Map接口简介 Map接口操作的是一对对象,是二元偶对象,一般用于查询,不常用于输出。(Map集合不能使用iterator迭代输出,Map里面的内容是成对的,而iterator每次只能查找一个值) Map类里面实际存放的是多个Map.Entry对象 二.Map集合子类HashMap HashMap:无序存放的,Key不允许重复(Value可以重复么?可以重复) HashMa...

133

〖Python接口自动化测试实战篇④〗- 接口自动化测试详解

[接口测试] 是相对来说和我们的功能测试 [最为接近的一种自动化测试手段] ,所以我们首先来学习接口测试的内容。 实现接口的开发与接口的测试,在我们的思维上、想法上、面向的态度上都是不一样的。所以大家要有一个思维上的转换,要认识了解一下 接口测试到底是做什么的、它的功能、意义在哪里。...

易编橙 · 终身成长社群,相遇已是上上签! 5万+

Java学习笔记——Map接口

Map接口 Map接口 Map接口中键和值一一映射. 可以通过键来获取值。 异常 NoSuchElementException:访问的值不存在 ClassCastException:对象类型错误 UnsupportedOperationException:尝试修改一个只读的Map 常用方法 Entry是Map接口中提供的...

weixin_30477293的博客 101

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

【Java学习笔记】Map接口及其实现类

1.Map集合的特点 将键映射到值的对象 一个映射不能包含重复的键 每个键最多只能映射到一个值 2.Map集合的功能概述 2.1 添加功能 V put(K key,V value):添加元素 2.2 删除功能 V remove(Object key):根据键删除键值对元素,并返回值 void clear():移除所有的键值对元素 2.3 判断功能 boolean containsK...

我们仨 1038

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

java学习笔记:Map接口

Map集合是基于键/值(Key-Value)的映射,它里面的元素成对存在,每个元素由键和值两部分组成,通过键可以找到对应的值,Collection集合,它的元素是独立存在的。Entry将键值对的对应关系封装成了对象,即键值对对象,这样我们在遍历 Map 集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。Entry是Map的一个内部接口,由Map的子类的内部类实现,可以使用 Map 接口中的 entrySet 方法返回一个 Entry 对象。所以table的长度肯定是2的倍数。

m0_72087285的博客 309

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Java学习笔记 --- Map接口方法

1、Map 与 Collection 并列存在。用于保存具有映射关系的数据:Ket - Value2、Map 中的 key 和 value 可以是任何引用类型的数据,会封装到 HashMap$Node 对象中3、Map 中的 key 不允许重复,原因和 HashSet 一样4、Map 中的 value 可以重复5、Map 的 key 可以为 null,value 也可以为 null,注意 key 为 null,只能有一个,value 为 null,可以多个。

乌云的博客 862

java集合之Map接口学习笔记

一、双列集合框架:Map 1.常用实现类结构 |---Map:双列数据,存储key-value对的数据 ---类似于高中的函数:y = f(x) |----HashMap:作为Map的主要实现类;线程不安全的,效率高;存储null的key和value |---LinkedHashMap:保证在遍历map元素时,可以按照添加的顺序实现遍历。 原因:在原有的HashMap底层结构基础上,添加了一对指针,指向前一个和后一个元素。

weixin_44585687的博客 180

【Java学习笔记】Map接口和常用方法

Map接口的常用方法、特点、遍历方式

2401_88623584的博客 347

java学习笔记(13):Map接口

继承的优点: 1 提高了代码的复用性 2 提高了代码的维护性 3 建立了类与类之间的关系,继承是多态的前提。 继承的缺点: 1 在一定程度上,造成类与类之间的强关联,即所谓的高耦合。 2 父类功能的改变对子类也会造成影响。 ...

光脚小孩的博客 263

Java基础学习笔记(九)Comparable接口、Map接口、泛型

<br />Comparable接口<br />实现Comparable接口的类,对象之间可以比较大小。<br />Comparable接口中只有一个方法<br />    public int compareTo(Object obj);<br />    该方法:返回 0 表示this == obj<br />            返回正数表示this > obj<br />            返回负数表示this > obj<br />实现了Comparable接口的类通过compareTo方法

Arthur Peng的专栏 827

Java学习笔记--Map接口

Map集合的特点将键映射到值的对象,一个映射不能包含重复的键,每个键只能映射到一个值。Map集合和Collection集合的区别? Map集合存储元素是成对出现的,Map的键是唯一的,值是可重复的。 Collection集合存储元素是单独出现的,Collection的子类Set是唯一,不可重复,List是可重复的。 Map集合的数据结构只针对键有效,和值无关。 Collection集合的数据结构对元

loveqRc的博客 544

Java学习笔记_24_Map接口

24.Map接口:  Map接口定义了存储“键(key)-值(value)映射对”的方法,Map  中不能有重复的“键”,Map实现类中储存的”键-值“映射对是通过  键来唯一标识的,Map底层的”键“使用Set来存放的,所以Map  中的映射对的”键”对应的类必须重写hashCode()和equals()方法,   常用String作为Map的“键”。    Map的添加、删除操作

阿_顺u012963457的专栏 984

Java学习笔记(三)Map接口及其重要实现类的用法

Map接口  Ø  Map中的每个成员方法由一个关键字(key)和一个值(value)构成。Map接口不直接继承于Collection接口,因为它包装的是一组成对的“键-值”对象的集合,而且在Map接口的集合中也不能有重复的key出现,因为每个键只能与一个成员元素相对应。 Ø  Map接口的子接口以及主要实现类有: 子接口:Bindings、ConcurrentMap、ConcurrentN

kexin_bo的专栏 1920

Java学习笔记---Map接口

Map

17的博客 307
上一篇: 【Java学习笔记】Set接口
下一篇: 【Java学习笔记】Collections工具类
jackson凌
博客等级 码龄2年 476粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackson凌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值