深入理解hashmap

HashMap是一种基于哈希表的键值对存储结构,它使用“链表散列”的方式,结合数组和链表(或红黑树)实现高效的数据存储。HashMap包括table、size、threshold、loadFactor和modCount等成员变量。哈希冲突通过链地址法解决,当链表长度超过8时,转换为红黑树。HashMap是非线程安全的,适合单线程环境,而HashTable是线程安全的。HashMap与HashSet的主要区别在于,HashSet是key-value结构的简化版,不存储value并是非线程安全的。面试中常见的问题涉及HashMap的扩容、hash算法、线程安全等问题。
摘要由CSDN通过智能技术生成

一、hashmap是什么?

哈希表是一种以键-值(key-value)映射存储数据的结构,是一个散列表,我们只要输入待查找的值即key,即可查找到其对应的hashcode。
它是基于快速存取的角度设计的,也是一种典型的**“空间换时间”**的做法。

声明HashMap时,通常使用的都是默认的构造方法:HashMap<K,V>,在其内部包装了一个Node<K,V>的类,并且用Node型的数组table用来存储数据,与ArrayList一样的实现了元素的增删以及扩容等功能。K一般是8种基本类型的封装类和String类,可存储null的键和null的值。

二、hashmap的数据结构是什么样子的?

HashMap“链表散列”的数据结构,即数组和链表/红黑树(自平衡二叉查找树,链表size大于8时使用红黑树代替链表)的结合体。
Hashmap中key会被映射成数据所在的地址,而value就在以这个地址为头的链表中,这种数据结构在获取的时候就很快。但这里存在的问题就是如果hash桶较小,数据量较大,就会导致链表非常的长,所以需要引入红黑树。

三、hashmap的成员变量有哪些?

HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。如下图:

hashmap包括几个重要的成员变量:table, size, threshold, loadFactor, modCount。

  1. table是一个Entry[]数组类型,而Entry实际上就是一个单向链表。哈希表的"key-value键值对"都是存储在Entry数组中的。 Entry 实现了Map.Entry 接口,即实现getKey(), getValue(), setValue(V value), equals(Object o), hashCode()这些函数。这些都是基本的读取/修改key、value值的函数。
  2. size是HashMap的大小,它是HashMap保存的键值对的数量。
  3. threshold是HashMap的阈值,用于判断是否需要调整HashMap的容量。threshold的值=“容量*加载因子”,当HashMap中存储数据的数量达到threshold时,就需要将HashMap的容量加倍。
  4. loadFactor就是加载因子。
  5. modCount是用来实现fail-fast机制的。

四、HashMap中的常用方法有哪些?

方法 作用
add()/ addall() 添加元素
remove() /clear() 删除元素
size() 元素数量
isEmpty() 是否为空
get() 返回指定键所映射的值
equals() 是否为同一个HashMap
containsKey() 是否包含指定的键
containsValue() 是否包含指定的值
keySet() 返回所有键的Set
values() 返回所有值的Collection
entrySet() 返回所有映射的Set

五、HashMap中的hash算法是怎样的?

关于hashcode:
1、HashCode的存在主要是为

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值