话题引入:

在面试中的小伙伴,想必只要问到HashMap的线程安全问题、数组+链表结构、JDK1.8对HashMap的优化So On,小伙伴们早已胸有成竹啦!

那就先让我们跟哈希来一段前世今生,可能否!

论HashMap的前世今生

上述图示底层实现程序在此不作详细赘述,有兴趣的童鞋可以艾特博主?yxd179哟!

重点切入:

HashMap在hashing的基础上,分别通过put()和get()方法储存和获取对象。当将键值对传递给put()方法时,它会调用键对象的hash()方法来计算hash值并储存值对象。当获取对象时,通过键对象的equals()方法找到正确的键值对,然后返回所获取的值对象。遇到碰撞问题如何解,当发生碰撞了怎么办,链表大大这时候就要来插足HashMap的前后今生啦,所找的对象将会储存在链表的下一个节点中,当声明作final(使用不可变的)的对象,并采用合适的equals()和hash()方法,将会大大减少碰撞的发生,从而提高效率(使用String,Interger这样的包装类作为键)。

若HashMap的大小超过了0.75(默认的负载因子),这时候就需要扩容啦,当重新调整HashMap的大小时,若俩个线程都发现需要rehashing,当通过get()方法获取值对象的时候,部分会出现null,So线程安全问题也就成了HashMap前后今生的第三者,那为什么要在多线程的环境下使用HashMap,又如何尽量避免or解决,更多?可以一起探讨哟!(collection框架提供方法能保证HashMap synchronized).

综上:童鞋们,?JDK1.8对HashMap的优化想必早已get到啦!

附Aop:引出下篇博文论题:Spring的代理Jdk VS Cglib,默认选择的是Jdk动态代理还是Cglib代理?它们分别是如何实现的,反射or字节码ASM?Jdk动态代理又Why只能是接口??欢迎来一起官宣哟!

相关文章: