Java Map集合详解(特点用法与3大实现类)

Java Map集合详解(特点用法与3大实现类)-mikechen

Java Map集合是Java程序员编程中使用Java集合频次非常高的,而且面试也经常问,下面我重点详解Java Map集合@mikechen

Map集合简介

Map集合又称键值对集合,是一种双列集合,每个元素包含两个数据,每个元素的格式:key=value(键值对元素)。

注意:Map集合中的键是不能重复的,但是值可以重复,一个键只能对应一个值。

 

Map集合特点

1.Map是一个双列集合,一个元素包含两个值(一个key,一个value)

2.Map集合中的元素,key和value的数据类型可以相同,也可以不同

3.Map中的元素,key不允许重复,value可以重复

4.Map里的key和value是一一对应的。

 

Map集合和Collection集合的区别

Map集合和Collection Java集合有所不同,Map集合存储的元素是成对出现的(键值对),MAP集合的键是唯一的,值是可重复的。

Collection Java集合存储的元素是单独出现的。Collection集合的儿子Set是唯一的,List是可重复的。

 

Map集合实现类

使用最多的Map集合是HashMap,重点掌握HashMap , LinkedHashMap , TreeMap。

 

HashMap

1.HashMap数据结构

首先我们从数据结构的角度来看:HashMap是:数组+链表+红黑树(JDK1.8增加了红黑树部分)的数据结构,如下所示:

Java Map集合详解(特点用法与3大实现类)-mikechen

2.哈希表来存储

HashMap采用哈希表来存储数据。

哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构,只要输入待查找的值即key,即可查找到其对应的值。

哈希表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。

3.哈希函数

哈希表中元素是由哈希函数确定的,将数据元素的关键字Key作为自变量,通过一定的函数关系(称为哈希函数),计算出的值,即为该元素的存储地址。
表示为:Addr = H(key),如下图所示:
Java Map集合详解(特点用法与3大实现类)-mikechen

哈希表中哈希函数的设计是相当重要的,这也是建哈希表过程中的关键问题之一。

4.核心问题

建立一个哈希表之前需要解决两个主要问题:

1)构造一个合适的哈希函数,均匀性 H(key)的值均匀分布在哈希表中

2)冲突的处理

冲突:在哈希表中,不同的关键字值对应到同一个存储位置的现象。

5.哈希冲突:链式哈希表

哈希表为解决冲突,可以采用地址法和链地址法等来解决问题,Java中HashMap采用了链地址法。

链地址法,简单来说,就是数组加链表的结合,如下图所示:

Java Map集合详解(特点用法与3大实现类)-mikechen

LinkedHashMap

LinkedHashMap继承自HashMap,它的多种操作都是建立在HashMap操作的基础上的。

同HashMap不同的是,LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry中的顺序,这也是Linked的含义,结构图如下:

Java Map集合详解(特点用法与3大实现类)-mikechen

加入插入顺序为key1,key2,key3,key4,那么就会维护一个红线所示的双向链表。

如果一句话抓住LinkedHashMap的本质,LinkedHashMap=HashMap+双向链表。

具体代码示例如下:

import java.util.LinkedHashMap;
import java.util.Map;

public class MapDemo01 {
    public static void main(String[] args) {
        //1、创建一个对象
        Map<String,Integer> maps=new LinkedHashMap<>();
        maps.put("苹果",3);
        maps.put("梨",5);
        maps.put("橘子",1);
        maps.put("香蕉",10);
        maps.put(null,null);
        System.out.println(maps);
    }
}

 

TreeMap

在Map集合框架中除了HashMap以外,TreeMap也是我们工作中常用到的集合对象之一。

Java中的TreeMap与HashMap区别在于:TreeMap提供了一种以排序顺序存储键/值对的有效方法,它是基于红黑树的NavigableMap实现。

与HashMap相比TreeMap是一个能比较元素大小的Map集合,会对传入的key进行了大小排序。

不同于HashMap的哈希映射TreeMap底层实现了树形结构,可以简单的理解为一颗倒过来的树:根在上叶在下,如下图所示:

Java Map集合详解(特点用法与3大实现类)-mikechen

 

如果用计算机术语来说的话,TreeMap实现了红黑树的结构,形成了一颗二叉树。

 

Java Map集合总结

本篇重点讲解了Java Map集合的特点,以及常见的Java Map:HashMap、TreeMap、LinkedHashMap的使用与底层实现,希望对你有所帮助。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法