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增加了红黑树部分)的数据结构,如下所示:
2.哈希表来存储
HashMap采用哈希表来存储数据。
哈希表(Hash table,也叫散列表),是根据关键码值(Key value)而直接进行访问的数据结构,只要输入待查找的值即key,即可查找到其对应的值。
哈希表其实就是数组的一种扩展,由数组演化而来。可以说,如果没有数组,就没有散列表。
3.哈希函数
哈希表中元素是由哈希函数确定的,将数据元素的关键字Key作为自变量,通过一定的函数关系(称为哈希函数),计算出的值,即为该元素的存储地址。
表示为:Addr = H(key),如下图所示:
哈希表中哈希函数的设计是相当重要的,这也是建哈希表过程中的关键问题之一。
4.核心问题
建立一个哈希表之前需要解决两个主要问题:
1)构造一个合适的哈希函数,均匀性 H(key)的值均匀分布在哈希表中
2)冲突的处理
冲突:在哈希表中,不同的关键字值对应到同一个存储位置的现象。
5.哈希冲突:链式哈希表
哈希表为解决冲突,可以采用地址法和链地址法等来解决问题,Java中HashMap采用了链地址法。
链地址法,简单来说,就是数组加链表的结合,如下图所示:
LinkedHashMap
LinkedHashMap继承自HashMap,它的多种操作都是建立在HashMap操作的基础上的。
同HashMap不同的是,LinkedHashMap维护了一个Entry的双向链表,保证了插入的Entry中的顺序,这也是Linked的含义,结构图如下:
加入插入顺序为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底层实现了树形结构,可以简单的理解为一颗倒过来的树:根在上叶在下,如下图所示:
如果用计算机术语来说的话,TreeMap实现了红黑树的结构,形成了一颗二叉树。
Java Map集合总结
本篇重点讲解了Java Map集合的特点,以及常见的Java Map:HashMap、TreeMap、LinkedHashMap的使用与底层实现,希望对你有所帮助。
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》