Java中的Map接口实现类HashMap和LinkedHashMap详解

 更新时间:2024年01月05日 09:22:44   作者:时间不会赖着不走  
这篇文章主要介绍了Java中的Map接口实现类HashMap和LinkedHashMap详解,我们常会看到这样的一种集合,IP地址与主机名,等,这种一一对应的关系,就叫做映射,Java提供了专门的集合类用来存放这种对象关系的对象,需要的朋友可以参考下

Map集合

现实生活中,我们常会看到这样的一种集合:IP地址与主机名,等,这种一一对应的关系,就叫做映射。

Java提供了专门的集合类用来存放这种对象关系的对象,即java.util.Map接口。

  • Collection中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。
  • Map中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的值。
  • Collection中的集合称为单列集合,Map中的集合称为双列集合。
  • 需要注意的是,Map中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。

Map常用子类

在这里插入图片描述

通过查看Map接口描述,看到Map有多个子类,这里我们主要讲解常用的HashMap集合、LinkedHashMap集合。

  • HashMap<K,V>:存储数据采用的哈希表结构,元素的存取顺序不能保证一致。由于要保证键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。
  • LinkedHashMap<K,V>:HashMap下有个子类LinkedHashMap,存储数据采用的哈希表结构+链表结构。通过链表结构可以保证元素的存取顺序一致;通过哈希表结构可以保证的键的唯一、不重复,需要重写键的hashCode()方法、equals()方法。 Map接口中的常用方法

Map接口中定义了很多方法,常用的如下:

  • public V put(K key, V value): 把指定的键与指定的值添加到Map集合中。
  • public V remove(Object key): 把指定的键 所对应的键值对元素 在Map集合中删除,返回被删除元素的值。
  • public V get(Object key) 根据指定的键,在Map集合中获取对应的值。
  • boolean containsKey(Object key) 判断集合中是否包含指定的键。
  • public Set keySet(): 获取Map集合中所有的键,存储到Set集合中。
  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

Map集合遍历键找值方式

键找值方式:即通过元素中的键,获取键所对应的值

分析步骤:

方式一:

1)获取所有键的集合。用keySet()方法实现

2)遍历键的集合,获取到每一个键。用增强for实现  

3)根据键去找值。用get(Object key)方法实现

public class MapDemo_03 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();
 
        //添加元素
        map.put("灰太狼", "红太狼");
        map.put("喜羊羊", "美羊羊");
        map.put("扁嘴伦", "暖羊羊");
 
        //获取所有键的集合。用keySet()方法实现
        Set<String> keySet = map.keySet();
        //遍历键的集合,获取到每一个键。用增强for实现
        for (String key : keySet) {
            //根据键去找值。用get(Object key)方法实现
            String value = map.get(key);
            System.out.println(key + "," + value);
        }
    }
}

方式二:

1)获取所有键值对对象的集合:Set<Map.Entry<K,V>> entrySet():获取所有键值对对象的集合

2)遍历键值对对象的集合,得到每一个键值对对象:用增强for实现,得到每一个Map.Entry

3)根据键值对对象获取键和值:用getKey()得到键,用getValue()得到值

public class MapDemo02 {
    public static void main(String[] args) {
        //创建集合对象
        Map<String, String> map = new HashMap<String, String>();
        //添加元素
        map.put("灰太狼", "红太狼");
        map.put("喜羊羊", "美羊羊");
        map.put("扁嘴伦", "暖羊羊");
        //获取所有键值对对象的集合
        Set<Map.Entry<String, String>> entrySet = map.entrySet();
        //遍历键值对对象的集合,得到每一个键值对对象
        for (Map.Entry<String, String> me : entrySet) {
            //根据键值对对象获取键和值
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key + "," + value);
        }
    }
}

Entry键值对对象

我们已经知道,Map中存放的是两种对象,一种称为key(键),一种称为value(值),它们在在Map中是一一对应关系,这一对对象又称做Map中的一个Entry(项)。

Entry将键值对的对应关系封装成了对象。即键值对对象,这样我们在遍历Map集合时,就可以从每一个键值对(Entry)对象中获取对应的键与对应的值。

既然Entry表示了一对键和值,那么也同样提供了获取对应键和对应值得方法:

  • public K getKey():获取Entry对象中的键。
  • public V getValue():获取Entry对象中的值。

在Map集合中也提供了获取所有Entry对象的方法:

  • public Set<Map.Entry<K,V>> entrySet(): 获取到Map集合中所有的键值对对象的集合(Set集合)。

Map集合遍历键值对方式

键值对方式:即通过集合中每个键值对(Entry)对象,获取键值对(Entry)对象中的键与值。

操作步骤与图解:

  1. 获取Map集合中,所有的键值对(Entry)对象,以Set集合形式返回。方法提示:entrySet()。
  2. 遍历包含键值对(Entry)对象的Set集合,得到每一个键值对(Entry)对象。
  3. 通过键值对(Entry)对象,获取Entry对象中的键与值。 方法提示:getkey() getValue()

HashMap(默认大小是16)

HashMap即是采用了链地址法来解决哈希冲突,也就是数组+链表的方式。

HashMap由数组+链表组成的,数组是HashMap的主体,**链表则是主要为了解决哈希冲突而存在的,**如果定位到的数组位置不含链表(当前entry的next指向null),那么查找,添加等操作很快,仅需一次寻址即可 。 如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

JDK1.8在JDK1.7的基础上针对增加了红黑树来进行优化。即当链表超过8时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能,其中会用到红黑树的插入、删除、查找等算法。 如果两个对象相等,则hashcode一定也是相同的 两个对象相等,对两个对象分别调用equals方法都返回true 两个对象有相同的hashcode值,它们也不一定是相等

LinkedHashMap

我们知道HashMap保证成对元素唯一,并且查询速度很快,可是成对元素存放进去是没有顺序的,那么我们要保证有序,还要速度快怎么办呢?

在HashMap下面有一个子类LinkedHashMap,它是链表和哈希表组合的一个数据存储结构## 标题。

到此这篇关于Java中的Map接口实现类HashMap和LinkedHashMap详解的文章就介绍到这了,更多相关Java中的Map接口实现类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java基本教程之Thread中start()和run()的区别 java多线程教程

    java基本教程之Thread中start()和run()的区别 java多线程教程

    这篇文章主要介绍了Thread中start()和run()的区别,Thread类包含start()和run()方法,它们的区别是什么?下面将对此作出解答
    2014-01-01
  • Tree组件实现支持50W数据方法剖析

    Tree组件实现支持50W数据方法剖析

    这篇文章主要为大家介绍了Tree组件实现支持50W数据的方法剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-08-08
  • java 逐行读取txt文本如何解决中文乱码

    java 逐行读取txt文本如何解决中文乱码

    在使用java读取txt文本中如含有中文,可能会出现乱码,很多初学者束手无策,本文将提供详细的解决方法
    2012-11-11
  • Mybatis一对多与多对一查询处理详解

    Mybatis一对多与多对一查询处理详解

    这篇文章主要给大家介绍了关于Mybatis一对多与多对一查询处理的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • java实现创建临时文件然后在程序退出时自动删除文件

    java实现创建临时文件然后在程序退出时自动删除文件

    这篇文章主要介绍了java实现创建临时文件然后在程序退出时自动删除文件,从个人项目中提取出来的,小伙伴们可以直接拿走使用。
    2015-02-02
  • SpringCloud中NacosNamingService的作用详解

    SpringCloud中NacosNamingService的作用详解

    这篇文章主要介绍了SpringCloud中NacosNamingService的作用详解,NacosNamingService类完成服务实例注册,撤销与获取服务实例操作,NacosNamingService初始化采用单例模式,使用反射生成,需要的朋友可以参考下
    2023-11-11
  • Response如何实现重定向

    Response如何实现重定向

    这篇文章主要介绍了Response如何实现重定向方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-09-09
  • Java C++刷题leetcode1106解析布尔表达式

    Java C++刷题leetcode1106解析布尔表达式

    这篇文章主要为大家介绍了Java C++刷题leetcode1106解析布尔表达式示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01
  • Java 实战项目锤炼之仿天猫网上商城的实现流程

    Java 实战项目锤炼之仿天猫网上商城的实现流程

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+jsp+servlet+mysql+ajax实现一个仿天猫网上商城项目,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • mybatis plus时间判断问题

    mybatis plus时间判断问题

    在MyBatisPlus中,时间判断可以通过XML转义的方式实现,例如使用>、<、<>、>=、<=进行比较,这种方法涉及到SQL符号的转义,确保查询语句的安全性和准确性,特别是在处理大于、小于和等于等逻辑时,正确的转义能够防止SQL注入等安全问题
    2024-09-09

最新评论