浅谈HashMap

						**谈谈自己对HashMap的理解**

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。
HashMap 继承于AbstractMap,实现了Map、Cloneable、java.io.Serializable接口。
HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

HashMap进行添加,删除,查找等操作,性能十分之高。

一、哈希表(hash table)也叫散列表,是一种非常重要的数据结构

与数组、线性链表等数据结构相比,在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下,仅需一次定位即可完成,时间复杂度为O(1)

当对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突。
Hash表 是一种逻辑数据结构,HashMap是Java中的一种数据类型,它通过代码实现了Hash表 这种数据结构,并利用此结构实现了Map的功能。去除value部分只看key部分就是一个Hash表 了。
HashMap即是采用了拉链法(链地址法)。

二、数据结构:
Java8以前HashMap通过 数组 + 单链表 的方式实现。

Java8 对 HashMap 进行了一些修改,最大的不同就是利用了红黑树,所以其由 数组+链表+红黑树 组成。

数组是HashMap的主体,链表则是主要为了解决哈希冲突而存在的,如果定位到的数组位置不含链表,那么对于查找,添加等操作很快,仅需一次寻址即可;如果定位到的数组包含链表,对于添加操作,其时间复杂度为O(n),首先遍历链表,存在即覆盖,否则新增;对于查找操作来讲,仍需遍历链表,然后通过key对象的equals方法逐一比对查找。所以,性能考虑,HashMap中的链表出现越少,性能才会越好。

在这里插入图片描述我们可以看出 Node实际上就是一个单向链表。这也是为什么我们说HashMap是通过拉链法解决哈希冲突的
在这里插入图片描述
在这里插入图片描述
//构造一个空的 HashMap ,默认初始容量(16)和默认负载系数(0.75)。
public HashMap()
//构造一个空的 HashMap具有指定的初始容量和负载因子。
public HashMap(int initialCapacity, float loadFactor)
//构造一个空的 HashMap具有指定的初始容量和默认负载因子(0.75)。
public HashMap(int initialCapacity)
//构造一个新的 HashMap与指定的相同的映射 Map 。
public HashMap(Map<? extends K, ? extends V> m)

## 插入链接与图片当map中元素超出设定的阈值后, 会进行resize (length * 2)操作, 扩容过程中对元素一通操作, 并放置到新的位置.

具体操作如下:

在jdk7中对所有元素直接rehash, 并放到新的位置.
在jdk8中判断元素原hash值新增的bit位是0还是1, 0则索引不变, 1则索引变成"原索引 + oldTable.length".

1 遍历HashMap的键值对
第一步:根据entrySet()获取HashMap的“键值对”的Set集合。
第二步:通过Iterator迭代器遍历“第一步”得到的集合。

// 假设map是HashMap对象// map中的key是String类型,value是Integer类型 Integer integ = null;
Iterator iter = map.entrySet().iterator();
while(iter.hasNext()) {
Map.Entry entry = (Map.Entry)iter.next();
// 获取key
key = (String)entry.getKey();
// 获取value
integ = (Integer)entry.getValue(); }

2 遍历HashMap的键
第一步:根据keySet()获取HashMap的“键”的Set集合。第二步:通过Iterator迭代器遍历“第一步”得到的集合
// 假设map是HashMap对象// map中的key是String类型,value是Integer类型 String key = null;
Integer integ = null;
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
// 获取key
key = (String)iter.next();
// 根据key,获取value
integ = (Integer)map.get(key); }

三、Java中的HashMap的工作原理是什么?

Java中的HashMap是以键值对(key-value)的形式存储元素的。HashMap需要一个hash函数,它使用hashCode()和
equals()方法来向集合/从集合添加和检索元素。当调用put()方法的时候,HashMap会计算key的hash值,然后把
键值对存储在集合中合适的索引上。如果key已经存在了,value会被更新成新值。HashMap的一些重要的特性是
它的容量(capacity),负载因子(load factor)和扩容极限(threshold resizing)。
hashCode()和equals()方法的重要性体现在什么地方?

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值