Map接口

Map接口

Map接口不是Collection的子接口,使用键、值映射表来存储

public interface Map<K,V>
  • Map不能有重复的键(覆盖),每个键可以映射到最多一个值
  • 允许将映射内容视为一组键、值集合或键值映射集合key不要求有序,不可以重复。
  • value也不要求有序,但可以重复
  • 当使用对象作为key时,要重写equalshashCode方法

抽象方法

方法名返回值描述
clear()void删除所有的映射
containsKey(Object key)booleanMap中是有没有这个key
containsValue(Object value)booleanMap有没有这个value
entrySet()Set<Map.Entry<K,V>>返回包含的映射的Set
get(Object key)V根据key返回对应的value
isEmpty()booleanMap是不是空的
keySet()Set返回Map中所有key的Set
put(K key, V value)V向Map添加映射
putAll(Map<? extends K,? extends V> m)void将指定Map中的映射复制到此映射
remove(Object key)V如果key存在,删除映射
remove(Object key, Object value)boolean当key、value映射存在时,删除
replace(K key, V value)boolean当key存在时,替换内容
size()intMap中映射的数量
values()Collection返回所有value的集合

JDK9 提供了创建不可修改 Map 对象的方法:

  1. Map.of
  2. Map.ofEntries
  3. Map.copyOf

Map的实现类较多,在此我们关注HashMapTreeMapHashTableLinkedHashMap

TreeMap

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
  • 继承AbstractMap,一个红黑树基于NavigableMap实现
  • 非线程安全的
  • key不能存 null,但是value可以存null
  • key必须是可比较的 (实现Comparable接口,传递一个Comparator比较器)

image-20230906205409035

主要方法
方法名返回值描述
put(K key, V value)V将指定的键值对插入到此映射中,如果映射以前包含一个键的映射关系,则旧值被替换。
get(Object key)V根据给定的键返回与此映射中的键关联的值,如果此映射不包含键的映射关系,则返回 null。
remove(Object key)V如果此映射包含键的映射关系,则删除与指定键关联的映射关系;否则返回 null。
containsKey(Object key)boolean如果此映射包含指定键的映射关系,则返回 true;否则返回 false。
containsValue(Object value)boolean如果此映射将值与此值相等(根据 compareTo() 的结果)的指定值关联,则返回 true;否则返回 false。
size()int返回此映射中的键-值映射对的数量。
clear()void移除此映射中的所有映射关系。

Hashtable

public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
  • 该类实现了一个哈希表,它将键映射到值

  • 不允许null作为键和值

  • 默认初始容量(initialCapacity)为 11 ,默认负载因子(loadFactor)为0.75f

  • 同步的(线程安全的)

  • 不保证顺序

  • 扩容方式是旧容量的2倍 +1

    • 为什么hashtable的扩容方式选择为2n+1
    • 为了均匀分布,降低冲突率
  • 数组 + 链表方式存储实现Hash表存储

  • 添加值时

    • 如果hash一样equalsfalse则将当前值添加到链表头
    • 如果hash一样equalstrue则使用当前值替换原来的值 (key相同)

image-20230906210022521

构造方法
方法名描述
Hashtable()构造一个新的,空的散列表,默认初始容量为11,负载因子为0.75。
Hashtable(int initialCapacity)构造一个新的,空的哈希表,具有指定的初始容量和默认负载因子(0.75)。
Hashtable(int initialCapacity, float loadFactor)构造一个新的,空的哈希表,具有指定的初始容量和指定的负载因子。
Hashtable(Map<? extends K,? extends V> t)构造一个与给定Map相同的映射的新哈希表。
常用方法

大多实现自Map所以不重复讲解

方法名返回值描述
toString()String返回此 Hashtable对象的字符串表示形式,其括在大括号中,并以 ASCII字符“ , ”(逗号和空格)分隔。

HashMap

public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
  • 基于哈希表的实现的Map接口
  • 允许null的值和null
  • 非线程安全
  • 默认容量 16,默认负载因子 0.75
    • HashMap容量为什么是2的n次方
  • 扩容是 2 倍旧的容量
  • 在存储数据时,keyhash计算调用的是HashMap中的hash方法
  • 添加值时,如果hash一样添加到链表尾部

HashMap类大致相当于Hashtable,除了它是不同步的,并允许null

内部采用数组+链表实现 ,JDK 8及以后版本增加红黑树的支持。

HashMapput过程:

image-20230906210819802

存储时,根据内部的hash方法计算key,来确定value的存储位置(Map的桶bucket),如果hash相同,在计算下标。如果产生没有碰撞(key不相同),直接放到桶中,由于hash相同,所以放到一个桶中。放的时候,如果没有超过阈值(8),以链表的形式放到后边,长度超过阈值且数组长度大于等于64将链表转换成红黑树存储。

  • 删除元素时,如果时以红黑树存储的如果节点小于 6 个将会变为链表存储
  • 如果产生碰撞(节点已经存在)就替换值

LinkedHashMap

public class LinkedHashMap<K,V>
	extends HashMap<K,V>
	implements Map<K,V>
  • 哈希表和双向链表实现的 Map 接口
  • 具有可预测的迭代次序(有序)
  • 非线程安全
  • 允许空元素
常用方法
方法名返回值描述
put(K key, V value)void将指定的值与此映射中的指定键关联(可选操作)。如果映射以前包含一个键的映射关系,则旧值被替换。
get(Object key)V根据给定的键从映射中获取值,返回 null 如果映射不包含键的映射关系。
remove(Object key)V从映射中删除指定键的映射关系,返回与键关联的值。如果映射包含键的映射关系,则必须首先使用 delete() 方法删除该键的映射关系,然后才能调用此方法。
containsKey(Object key)boolean如果此映射包含指定键的映射关系,则返回 true;否则返回 false。
containsValue(Object value)boolean如果此映射将值与此值关联(根据定义,值可能相等),则返回 true;否则返回 false。
size()int返回此映射中的键-值映射对的数量。
clear()void移除此映射中的所有映射关系。

ConcurrentHashMap

java.util.concurrent.ConcurrentHashMap

public class ConcurrentHashMap<K,V> extends AbstractMap<K,V>
	implements ConcurrentMap<K,V>, Serializable

JavaJDK1.5开始提供的一个HashMap线程安全的实现类。且java.util.concurren t包下所有的类都是线程安全的

Properties

public
class Properties extends Hashtable<Object,Object>

Properties类表示一组持久的属性。Properties可以保存到流中或从流中加载。 属性
列表中的每个键及其对应的值都是一个字符串。

内部使用ConcurrentHashMap存储

操作和Hashtable基本一致,主要用于从流中记载或保存到流中去。(后期JDBC模块会使
用到)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

言行不易

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值