Java集合

1.map

  Hashmap

Java集合之一—HashMap_woshimaxiao1的博客-CSDN博客_hashmap10分钟拿下 HashMap_一小页的博客-CSDN博客Java集合之一—HashMap_woshimaxiao1的博客-CSDN博客_hashmap        (简单一些)

  这个函数可以简单描述为:存储位置 = f(关键字) ,这个函数f一般称为哈希函数

 然而万事无完美,如果两个不同的元素,通过哈希函数得出的实际存储地址相同怎么办?也就是说,当我们对某个元素进行哈希运算,得到一个存储地址,然后要进行插入的时候,发现已经被其他元素占用了,其实这就是所谓的哈希冲突,也叫哈希碰撞。前面我们提到过,哈希函数的设计至关重要,好的哈希函数会尽可能地保证 计算简单和散列地址分布均匀,但是,我们需要清楚的是,数组是一块连续的固定长度的内存空间,再好的哈希函数也不能保证得到的存储地址绝对不发生冲突。那么哈希冲突如何解决呢?哈希冲突的解决方案有多种:开放定址法(发生冲突,继续寻找下一块未被占用的存储地址),再散列函数法,链地址法,而HashMap即是采用了链地址法,也就是数组+链表的方式。

HashMap的主干是一个Entry数组。Entry是HashMap的基本组成单元,每一个Entry包含一个key-value键值对。(其实所谓Map其实就是保存了两个对象之间的映射关系的一种集合

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


Node是链表结构有4个关键属性hash、key、value、next,hash是由key通过如下计算得来“(key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);”,key与value则是用户put进去的值,next则是节点的下一个节点。  key->hash

HashMap存的是键值对(key-value),通过key可以唯一获取value。键值是否相同是通过两个函数确定的,分别是hashCode()和equals()。hashCode()确定了键值对存放的位置,equals()确定了两个对象是否相同。通常常见数据类型都是重写了hashCode()和equals()方法。例如HashMap存的键是String类型,那么只要字符串的值相同时,就可以看作是同一个键。

键值对key-value键值对是什么?_长颈鹿仙女的博客-CSDN博客_键值对

 PUT 方法:

第一步:通过 HashMap 自己提供的hash 算法算出当前 key 的hash 值

第二步:通过计算出的hash 值去调用 indexFor 方法计算当前对象应该存储在数组的几号位置

第三步:判断size 是否已经达到了当前阈值,如果没有,继续;如果已经达到阈值,则先进行数组扩容,将数组长度扩容为原来的2倍。

> 请注意:size 是当前容器中已有 Entry 的数量,不是数组长度。

第四步:将当前对应的 hash,key,value封装成一个 Entry,去数组中查找当前位置有没有元素,如果没有,放在这个位置上;如果此位置上已经存在链表,那么遍历链表,如果链表上某个节点的 key 与当前key 进行 equals 比较后结果为 true,则把原来节点上的value 返回,将当前新的 value替换掉原来的value,如果遍历完链表,没有找到key 与当前 key equals为 true的,就把刚才封装的新的 Entry中next 指向当前链表的始节点,也就是说当前节点现在在链表的第一个位置,简单来说即,先来的往后退。

OK!现在,我们已经将当前的 key-value 存储到了容器中。

为什么我选择聊 PUT 方法?

因为 PUT 是操作HashMap的最基础操作,了解了 PUT 的机制后,再去看 API其他方法源码的时候你会有所眉目,你可以带着这种初知去探究 HashMap 的其他方法,你一定会豁然开朗。


HashMap 详解_与忘_的博客-CSDN博客_hashmap

2.TreeMap

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值