Java集合大总结——Map集合

Map集合框架

  • 1、Map集合框架
    • [1.1 关于Map接口中的主要实现类](#1.1 关于Map接口中的主要实现类)
    • [1.2 各实现类的特点:](#1.2 各实现类的特点:)
  • [2. HashMap 和 Hashtable 的区别](#2. HashMap 和 Hashtable 的区别)
  • [3. HashMap 和 HashSet 区别](#3. HashMap 和 HashSet 区别)
  • [4. HashMap 和 TreeMap 区别](#4. HashMap 和 TreeMap 区别)

1、Map集合框架

注意:Map接口是在java.util.Map 的包下,Map 接口不是 Collection 的子接口,它是使用键、值映射表来存储【Map 不能有重复的键(覆盖),每个键可以映射到最多一个值】。
Map 接口的实现类较多,在此我们关注 HashMap 、 TreeMap 、 HashTable 、 LinkedHashMap

1.1 关于Map接口中的主要实现类

  1. 继承结构图如下所示
  2. Map接口实现类的代码:
  • HashMap类:
java 复制代码
public class HashMap<K,V> extends AbstractMap<K,V>
   implements Map<K,V>, Cloneable, Serializable 
  • TreeMap类:
java 复制代码
public class TreeMap<K,V>
    extends AbstractMap<K,V>
    implements NavigableMap<K,V>, Cloneable, java.io.Serializable
  • LinkedHashMap类:
java 复制代码
public class LinkedHashMap<K,V>
    extends HashMap<K,V>
    implements Map<K,V>
  • Hashtable类:
java 复制代码
public class Hashtable<K,V>
    extends Dictionary<K,V>
    implements Map<K,V>, Cloneable, java.io.Serializable

1.2 各实现类的特点:

  • HashMap
  • TreeMap
    • 继承 AbstractMap ,底层数据结构是一个红黑树基于 NavigableMap 实现
    • 非线程安全的
    • key 不能存 null ,但是 value 可以存 null
    • key 必须是可比较的 (即要么实现 Comparable 接口,要么传递一个 Comparator 比较器)
  • Hashtable
    • 该类实现了一个哈希表,它将键映射到值
    • 不允许 null 作为键和值
    • 默认初始容量(initialCapacity)为 11 ,默认负载因子( loadFactor )为 0.75f
    • 同步的(线程安全的)
    • 不保证顺序
    • 扩容方式是旧容量的2倍 +1
    • 数组 + 链表方式存储
    • 添加值时
      • 如果 hash 一样 equals 为 false 则将当前值添加到链表头
      • 如果 hash 一样 equals 为 true 则使用当前值替换原来的值 ( key 相同)。
  • LinkedHashMap
    • 哈希表和双向链表实现的 Map 接口
    • 具有可预测的迭代次序(有序)
    • 非线程安全
    • 允许空元素

2. HashMap 和 Hashtable 的区别

  • 线程是否安全: HashMap 是非线程安全的, Hashtable 是线程安全的,因为Hashtable 内部的方法基本都经过synchronized修饰。(如果你要保证线程安全的话就使用 ConcurrentHashMap 吧!,Hashtable已经过时了);
  • 效率: 因为线程安全的问题, HashMap 要比 Hashtable 效率高一点。
  • Null key Null value 的支持: HashMap 可以存储 nullkeyvalue,但 null 作为键只能有一个,null 作为值可以有多个;Hashtable 不允许有null键和null值,否则会抛出 NullPointerException 。
  • 初始容量大小和每次扩充容量大小的不同:
    • 创建时如果不指定容量初始值, Hashtable 默认 的初始大小为 11,之后每次扩充,容量变为原来的 2n+1
    • HashMap 默认 的初始化大小为 16。之后每次扩充,容量变为原来的 2 倍
    • 创建时如果给定 了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为 2 的幂次方大小
  • 底层数据结构: JDK1.8 以后的 HashMap 在解决哈希冲突 时有了较大的变化,当链表长度大于阈值 (默认为 8)时,将链表转化为红黑树 (将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),以减少搜索时间。 Hashtable 没有这样的机制。

3. HashMap 和 HashSet 区别

  • HashSet 底层就是基于 HashMap 实现的。
  • 实现接口不同
    • HashMap 实现Map接口
    • HashSet 实现Set接口
  • 存储不同
    • HashMap 存储键值对
    • HashSet 存储对象
  • 添加方式不同
    • HashMap 调用put()添加元素
    • HashSet 调用add()添加元素
  • 计算HashCode不同
    • HashMap 使用键(Key)计算 hashcode
    • HashSet 使用成员对象来计算hashcode值,对于两个不同的对象来说hashcode 可能相同,所以还要用 equals() 方法用来判断对象的相等性.

4. HashMap 和 TreeMap 区别

  1. TreeMap 和 HashMap 都继承自 AbstractMap ,但是需要注意的是 TreeMap 它还实现了 NavigableMap 接口和 SortedMap 接口。
  2. 实现NavigableMap接口让 TreeMap 有了对集合内元素的搜索的能力。
  3. 实现SortedMap接口让 TreeMap 有了对集合中的元素根据键排序的能力。

综上,相比于HashMap来说 TreeMap 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。

相关推荐
小蜗牛慢慢爬行6 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
Algorithm157616 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
shinelord明25 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
新手小袁_J30 分钟前
JDK11下载安装和配置超详细过程
java·spring cloud·jdk·maven·mybatis·jdk11
呆呆小雅31 分钟前
C#关键字volatile
java·redis·c#
Monly2132 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu33 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa
Eric.Lee202133 分钟前
moviepy将图片序列制作成视频并加载字幕 - python 实现
开发语言·python·音视频·moviepy·字幕视频合成·图像制作为视频
Ttang2334 分钟前
Tomcat原理(6)——tomcat完整实现
java·tomcat
7yewh35 分钟前
嵌入式Linux QT+OpenCV基于人脸识别的考勤系统 项目
linux·开发语言·arm开发·驱动开发·qt·opencv·嵌入式linux