> 文档中心 > 【耀杨的罗曼史】小红:耀杨欧巴,能教教我hashmap吗?【雀氏润】

【耀杨的罗曼史】小红:耀杨欧巴,能教教我hashmap吗?【雀氏润】



“百分百无规则教学时间!🔥🔥🔥”

兄弟萌晚上好!我是无规则教学创始人【东星耀杨】,感谢兄弟萌对我的不离不弃,爱你们熬爱你们!还望兄弟萌给为师一个三连支持,要不然我蒸滴会紫砂的!
在这里插入图片描述

《太上老君急急如律令!道心不灭!》

兄弟萌兄弟萌~蒸滴想你们!今天更新只有一个目的,那就是带着兄弟萌破冰,不教会不下播,还是那句话,真男人包ck!蒸滴c!

*“好运来那个好运来……”*熟悉的电话铃声又又又响起来了。

“M D!到底是谁呀,不要纷扰我道心啦~”等下为师,我必须让他知道为师的实力!

杨哥杨哥~欧巴!能教教我hash算法吗?今天被老师泼了三桶凉水呜呜呜呜”电话传来动听的女声……
在这里插入图片描述

小红:清澈如百灵鸟般的嗓音深得为师喜欢,雀氏润兄弟萌!!!

“太上老君急急如律令,道心护体,道心不灭,哎呀,哇靠,是小红!哇哇!”为师蒸滴搞不了了呀!

兄弟萌兄弟萌商量个事呗,只要帮我拿下小红,小键为师赠给兄弟萌玩,诶嘿~好不好嘛兄弟萌,数据库明天好嘛!

就这么愉快地决定了,反正肯定有好多兄弟萌也不是很理解哈希表,带着兄弟萌复习一下,哇靠蒸滴c!
在这里插入图片描述

hashmap数据结构

“链表散列”

兄弟萌注意看我细节(今天有小红!!!
1.在java编程语言中,只有两种最基本的结构:数组,还有模拟指针。hashmap也不例外,由数组和链表两部分组成,也成为链表散列:
横排表示数组
纵列表示链表
如图:
在这里插入图片描述
2.新建hashmap:
hashmap其实就是一种数据结构,新建hashmap的代码结构如下:

transient Entry[] table;  static class Entry<K,V> implements Map.Entry<K,V> {   final K key;   V value;   final int hash;   Entry<K,V> next;  }  

在新建一个hashmap时,初始化了一个数组。 上面的Entry就是数组中的元素,它持有一个指向下一个元素的引用,这就构成了链表。
✨✨✨****当我们往hashmap中put元素的时候,先根据key的hash值得到这个元素在数组中的位置(即下标),然后就可以把这个元素放到对应的位置中了。如果这个元素所在的位子上已经存放有其他元素了,那么在同一个位子上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。从hashmap中get元素时,首先计算key的hashcode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素。✨✨✨
在这里插入图片描述

hash算法

这就是小红刚刚问到的问题,在这里为师做一个简单的赘述。

我们知道要在hashmap中寻找某一个元素,需要先根据key的hash值来求得元素在数组中的位置(下标),那么计算这个位置的方法叫做hash算法。

在这里为师不阐述深层原理了,很多博主讲解了深层的原理,有兴趣的兄弟萌可以去康康。

在这里为师就总结两点:
1.首先通过hashcode找到数组中的元素
2.再通过key中的equals方法找到key对应的value值。

区分hashmap和hashtable


很多兄弟萌突然私信我不理解hashtable 和hashmap的区别,傻傻分不清。

在这里为师简单列出二者的异同点供兄弟萌参考:

相同点:

❗️ hashmap和Hashtable都实现了map、Cloneable(可克隆)、Serializable(可序列化)这三个接口 不同点:

不同点:

❗️1.底层数据结构不同 :jdk1.7底层都是数组+链表,但jdk1.8 HashMap加入了红黑树

❗️ 2.Hashtable 是不允许键或值为 null 的,HashMap 的键值则都可以为 null。

❗️3.添加key-value的hash值算法不同:HashMap添加元素时,是使用自定义的哈希算法,而HashTable是直接采用key的hashCode()

❗️4.实现方式不同:Hashtable 继承的是 Dictionary类,而 HashMap 继承的是 AbstractMap 类。

❗️5.初始化容量不同:HashMap 的初始容量为:16,Hashtable 初始容量为:11,两者的负载因子默认都是:0.75。 扩容机制不同:当已用容量>总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 +1。

❗️6.支持的遍历种类不同:HashMap只支持Iterator遍历,而HashTable支持Iterator和Enumeration两种方式遍历,HashMap的Iterator是fail-fast迭代器。当有其它线程改变了HashMap的结构(增加,删除,修改元素),将会抛ConcurrentModificationException。不过,通过Iterator的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。

❗️7.迭代器不同:HashMap的迭代器(Iterator)是fail-fast迭代器,而Hashtable的enumerator迭代器不是fail-fast的。所以当有其它线程改变了HashMap的结构(增加或者移除元素),将会抛出ConcurrentModificationException,但迭代器本身的remove()方法移除元素则不会抛出ConcurrentModificationException异常。但这并不是一个一定发生的行为,要看JVM。而Hashtable
则不会。

❗️ 8.部分API不同:HashMap不支持contains(Object value)方法,没有重写toString()方法,而HashTable支持contains(Object
value)方法,而且重写了toString()方法

❗️9.同步性不同: Hashtable是同步(synchronized)的,适用于多线程环境,而hashmap不是同步的,适用于单线程环境。多个线程可以共享一个Hashtable;而如果没有正确的同步的话,多个线程是不能共享HashMap的。

《先溜了兄弟萌!!》

😭😭😭兄弟萌,不得不说小红雀氏润呀!今天就讲这些吧,兄弟萌不懂就来私信为师,高低给你整明白了,今天为师精神是在不好,最近记性也不太好,写写就忘记自己想的啥来着,今晚为师早点去找小键睡睡了,兄弟萌为师先溜了,今天蒸滴没有骚话啦!
在这里插入图片描述