前言
知识点有点整理不下来,这边贴两个我觉得不错的链接,一个是b站的学习视频,其课件将相关知识叙述的很清楚。还有个是一篇不错的博客。
https://www.bilibili.com/video/BV1nJ411J7AA?from=search&seid=6046556222621910889
https://www.cnblogs.com/chengxiao/p/6059914.html
(个人觉得,在关于数组长度为什么必须是2的n次方,以及jdk1.8新特性的讲解上,视频课件更为优秀)
然后关于ConcurrentHashMap:
https://www.cnblogs.com/chengxiao/p/6842045.html
然后我自己写了几个知识点,免得我以后忘记了。
1. HashMap的工作原理
HashMap是基于哈希法的原理,使用put()函数将键值对存储到HashMap中,使用get()函数从HashMap中获取对象。在调用put()方法时,会先对键调用HashCode()方法,返回的HashCode()用于找到桶的位置来存储Entry( [ˈentri])对象。
(注意,HashMap是在bucket(桶)中存储键对象和值对象,并不是仅仅在bucket中存储值。一定不要漏了对象这两个字)
2. 关于Hash冲突
当两个元素的key计算而来的hash值相同即发生hash碰撞。注意的是,数组下标相同的,hash值不一定相同。 所以在数组下标相同时,要先判断hashcode值是否相同,hashcode值相同时,会调用equals()方法来比较key值,然后存储对象
3. HashMap和HashTable的区别
HashMap是基于哈希表的Map接口实现,以key-value存储形式存在,即主要用来存放键值对。和HashTable线程安全不一样,HashMap的实现是不同步的,这也意味着它不是线程安全的,但HashMap的value和key是可以存储null值的,且从源码可以知道,null值是放在第0个桶。若是需要线程安全,可以使用ConcurrentHashMap