首页 > 其他分享 >Map 接口及实现类

Map 接口及实现类

时间:2023-07-06 18:16:23浏览次数:41  
标签:Map HashMap 实现 Object value 接口 key println

Map 接口

Map 接口介绍

image

image

image

  1. Map 和 Collection 并列,用于保存具有映射关系的数据:Key - Value
  2. Map 中的 key 和 value 可以是任何的引用类型数据,会封装到 HashMap$Node 对象中
  3. Map 中的 key 不允许重复,同 HashSet 一样
  4. Map 的 value 可以重复
  5. Map 的 key 可以为null,value 也可以为 null,key 为null 只能有一个,value 为 null 可以有多个
  6. 常用 String 类作为 Map 的 key
  7. key 和 value 存在单向一对一关系,即通过指定的 key 中能找到对应的 value
  8. Map 存放数据的 key - value 示意图,一对 k - v 是放在一个 HashMap$Node 中的,又因为 Node 是实现了 Entry 接口,有些书上也说,一对 k - v 就是一个 Entry
  9. 为了方便遍历,还会创建 EntrySet 集合 transient Set<Map.Entry<K,V>> entrySet;
image-20230706161832079

Map 接口常用方法

void	clear()
boolean	containsKey(Object key)
boolean	containsValue(Object value)
Set<Map.Entry<K,V>>	entrySet()
//Returns a Set view of the mappings contained in this map.
boolean	equals(Object o)
V	get(Object key)
boolean	isEmpty()
Set<K>	keySet()
V	put(K key, V value)
void	putAll(Map<? extends K,? extends V> m)
V	remove(Object key)
default V	replace(K key, V value)
default boolean	replace(K key, V oldValue, V newValue)
default void	replaceAll(BiFunction<? super K,? super V,? extends V> function)
int	size()
Collection<V>	values()

Map 的 遍历

//第一组: 先取出 所有的 Key , 通过 Key 取出对应的 Value
        Set keyset = map.keySet();
        System.out.println("-----第一种方式-----");
        // 增强For
        for (Object key : keyset) {
            System.out.println(key + "-" + map.get(key));
        }

        System.out.println("-----第二种方式-----");
        // 迭代器
        Iterator iterator = keyset.iterator();

        while (iterator.hasNext()) {
            Object key = iterator.next();
            System.out.println(key + "-" + map.get(key));
        }
// 第二组 通过EntrySet 来获取k-v
        Set entrySet = map.entrySet();
        // (1) 增强For
        System.out.println("-----使用EntrySet的增强For-----");
        for (Object entry : entrySet) {
            Map.Entry m = (Map.Entry) entry;
            System.out.println(entry.toString()); // key = value // HashMap toString()
        }

        // (2) 迭代器
        System.out.println("-----使用EntrySet的迭代器------");
        Iterator iterator2 = entrySet.iterator();
        while (iterator2.hasNext()) {
            Object entry = iterator2.next();
            System.out.println(entry);
        }
// 第三组,取出所有的Value
        Collection values = map.values();
        // 可以使用Collection 的所有遍历方法
        // (1) 增强For
        for (Object value :values) {
            System.out.println(value);
        }

        // (2) 迭代器
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()) {
            Object value =  iterator1.next();
            System.out.println(value);

        }

Map 接口的实现类 —— HashMap

  1. Map 接口的常用实现类:HashMap、Hashtable 和 Properties

  2. HashMap 是 Map 接口使用频率最高的实现类

  3. HashMap 是以 key - value 的方式存储数据(HashMap$Node)

  4. key 不能重复,但是值可以重复,允许使用 null 键和 null值

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

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

  7. HashMap 没有实现同步,因此线程不安全,方法没有做同步互斥的操作

扩容机制 同 HashSet 一样

Map 接口实现类 —— Hashtable

  1. 存放的元素是键值对,即 key - value
  2. Hashtable 的 key 和 value 都不能为 null,否则会抛出 NullPointerException
  3. Hashtable 使用的方法基本和 HashMap 一样
  4. Hashtable 是线程安全的

Hashtable 和 HashMap 的对比

版本 线程安全(同步) 效率 是否允许null键值
HashMap 1.2 不安全 可以
Hashtable 1.0 安全 较低 不可以

Map 接口实现类 —— Properties

  1. Properties 类继承 Hashtable 类,使用特点和 Hashtable 类似
  2. Properties 可以用于从 xxx.properties 文件中,加载数据到 Properties 类对象,并进行读取和修改
  3. xxx.properties 文件通常作为配置文件

Map 接口实现类 —— TreeMap

  • TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序
  • 可以使用元素的自然顺序,也可以使用集合中自定义的比较器来进行排序
  • reeMap实现了红黑树的结构

TreeMap的特点

  • 不允许出现重复的key
  • 可以插入null键,null值
  • 可以对元素进行排序
  • 无序集合(插入和遍历顺序不一致)

如何选择集合实现类

在开发中,选择什么集合实现类,主要取决于业务操作特点,然后根据集合实现类特性进行选择,分析如下:

  1. 先判断存储的类型 (一组对象【单列】 或 一组键值对【双列】)

  2. 一组对象:Collection 接口

    • 允许重复:List
      • 增删多:LinkedList (底层维护了一个双向链表
      • 改查多:ArrayList (底层维护Object类型的可变数组
    • 不允许重复:Set
      • 无序:HashSet (底层是HashMap,底层维护了一个哈希表数组 + 链表 + 红黑树】)
      • 排序:TreeSet (底层是 红黑树)
      • 插入和取出顺序一致:LinkedHashSet( HashMap + 双向链表
  3. 一组键值对:Map

    • 键无需:HashMap(底层是:哈希表 jdk7:数组 + 链表,jdk8:数组 + 链表 + 红黑树
    • 键排序:TreeMap (底层是红黑树
    • 键的插入和取出顺序一致:LinkedHashMap (HashMap + 双向链表)
    • 读取文件:Properties

标签:Map,HashMap,实现,Object,value,接口,key,println
From: https://www.cnblogs.com/ai135/p/17532926.html

相关文章

  • 软件测试常用工具总结(测试管理、单元测试、接口测试、自动化测试、性能测试、负载测试
    在软件测试的过程中,多多少少都是会接触到一些测试工具,作为辅助测试用的,以提高测试工作的效率,使用好了测试工具,能对测试起到一个很好的作用,同时,有些公司,也会要求掌握一些测试工具,或者,是在面试时,也会被问到测试工具的,比如,在面试时,最常见的问题便是,你在测试时,用的是什么测试工具?或者......
  • Java实现浏览器端大文件分片上传控件
    ​ 核心原理: 该项目核心就是文件分块上传。前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题。* 如何分片;* 如何合成一个文件;* 中断了从哪个分片开始。如何分,利用强大的js库,来减轻我们的工作,市场上已经能有关于大文件分块......
  • Python如何实现docstring
    docPython语言从排版上看强制要求了一些书写规范,算是强制赋予了每个程序员一个"代码洁癖"。作为规范的一部分,可以在在类函数的开始增加注释,并且语言本身为这种注释做了"背书":可以通过help展示这个帮助文档的内容。这个本来是Python一个很细小的功能,也是一个很有意思的语法糖(因......
  • 阿里架构师万字总结:Mybatis插件实现原理,Mybatis就要这么用
     mybatis中的插件,也就是拦截器interceptor,也挺有意思的。它的简单使用,就直接拿文档中的示例来简单说下一、使用使用方式很简单Copy//使用这个注解,表明这是一个拦截器@Intercepts(//方法签名{@Signature(//被拦截方法所在的类type=Executor.class......
  • Set 接口及实现类
    Set接口及实现类Set接口基本介绍无序(添加和取出顺序不一致),没有索引不允许重复,所以最多包含一个nullJDKAPI中Set接口实现类Set接口和常用方法常用方法和List接口一样,Set接口也是Collection的子接口,因此,常用方法和Collection接口一样Set接口的遍历方......
  • API接口的重要性
    API接口的重要性在现代软件开发中无可替代。以下是API接口的几个重要方面:1.实现系统集成:API接口允许不同应用程序之间实现数据共享和交流。通过API接口,不同的软件系统可以相互连接和协作,实现系统集成。这样可以提高系统的功能和效率,让不同系统之间实现无缝衔接。2.增加开发效......
  • 想了解API接口,这一篇就够了
    API(ApplicationProgrammingInterface)接口,对于大多数人来说可能还比较陌生,但实际上我们每天都在与它打交道。无论是使用手机上的应用程序,还是在网上购物,都少不了API接口的应用。那么,到底什么是API接口呢?如何调用API接口来获取淘宝商品数据呢?本文将为大家详细解答。什么是API接口......
  • java实现文本转语音(即语音朗读)
    java实现文本转语音(即语音朗读)1.方式一:使用jacob离线语音合成1.下载jacob-1.18.zip链接:https://pan.baidu.com/s/1-zYB9I4VF5cPuj3ok1WLyg提取码:7t1g2.将jacob-1.18-x64.dll拷贝到jdk的bin目录或windows/SysWOW64目录中3.添加需要的依赖<!--https://mvnrepository.com/a......
  • Django restframwork中使用分页及实现自定义分页
    关于为何要分页以及如何在Django+Template架构中如何使用分页,可以参考之前的文章django自定义分页类和使用总结[1]DjangoRestFramework中分页限制今天开篇我们先不讲如何使用,我们先说Django+restframework实现前后端分离项目开发时,分页功能使用的限制?缘由是之前在开发运维......
  • API接口技术开发心得,阿里巴巴中国站获得1688商品详情数据采集商品规格信息列表调用参
     1688商品详情API接口的重要性主要体现在以下几个方面:提供全面的商品信息:1688商品详情API接口可以提供详尽的商品信息,包括商品名称、规格、价格、产地、供应商信息等。这些信息对于用户来说是非常重要的,可以帮助用户全面了解商品的特点和属性,从而做出更明智的购买决策。......