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 主要多了对集合中的元素根据键排序的能力以及对集合内元素的搜索的能力。

相关推荐
色空大师10 分钟前
23种设计模式
java·开发语言·设计模式
闲人一枚(学习中)10 分钟前
设计模式-创建型-建造者模式
java·设计模式·建造者模式
Bruce小鬼22 分钟前
QT文件基本操作
开发语言·qt
2202_7544215428 分钟前
生成MPSOC以及ZYNQ的启动文件BOOT.BIN的小软件
java·linux·开发语言
蓝染-惣右介31 分钟前
【MyBatisPlus·最新教程】包含多个改造案例,常用注解、条件构造器、代码生成、静态工具、类型处理器、分页插件、自动填充字段
java·数据库·tomcat·mybatis
小林想被监督学习31 分钟前
idea怎么打开两个窗口,运行两个项目
java·ide·intellij-idea
HoneyMoose33 分钟前
IDEA 2024.3 版本更新主要功能介绍
java·ide·intellij-idea
我只会发热35 分钟前
Java SE 与 Java EE:基础与进阶的探索之旅
java·开发语言·java-ee
是老余36 分钟前
本地可运行,jar包运行错误【解决实例】:通过IDEA的maven package打包多模块项目
java·maven·intellij-idea·jar
crazy_wsp37 分钟前
IDEA怎么定位java类所用maven依赖版本及引用位置
java·maven·intellij-idea