Java · 成长之路

问与答 · JAVA基础

2018-07-12  本文已影响0人  南山羊

emm...

HashMap的源码,实现原理,JDK8中对HashMap做了怎样的优化。

哈希表是由 数组 + 链表 组成的,一个长度为 16 的数组中,每个元素存储的是一个链表的头结点。那么这些元素是按照什么样的规则存储到数组中呢。一般情况是通过 hash(key)%len 获得,也就是元素的key的哈希值对数组长度取模得到。比如上述哈希表中, 12%16=12 , 28%16=12 , 108%16=12 , 140%16=12 。所以 1228108 以及 140 都存储在数组下标为 12 的位置。

JDK8中,HashMap 加入了红黑树的使用,当节点长度大于8并且数组的长度大于64时,该节点链表就会转化成红黑树。数组长度小于64并且节点长度大于8时,仅仅扩容,并不会将链表转换成红黑树。

相关文献 -> http://www.importnew.com/28263.html

HaspMap扩容是怎样扩容的,为什么都是2的N次幂的大小。

HashMap计算 Key 值在数组中的位置是使用 Key.hashcode()数组长度减一 进行 & 运算。当长度是 2 的N次幂时,数组长度减一 的二进制实则为 N-1个1。进行与或运算时,能够快速取到小于自己的一个整数。比 % 取模速度更快。

HashMap,HashTable,ConcurrentHashMap的区别。

极高并发下HashTable和ConcurrentHashMap哪个性能好,如何实现的。

上个问题已经回答了,在极高并发下ConcurrentHashMap的性能要好于HashTable,因为ConcurrentHashMap采用的是分段锁,不会造成整个对象锁住,在高并发时性能明显好于Hashtable。

HashMap在高并发下如果没有处理线程安全会有怎样的安全隐患,具体表现是什么。

相关文献 -> https://www.cnblogs.com/hunrry/p/9183027.html

java中四种修饰符的限制范围。

Object类中的方法。

clone()

clone()函数的用途是用来另存一个当前存在的对象。

hashCode()和equals()

equals()用于确认两个对象是否相同,hashCode()用于获取对象的哈希值,哈希值相同的对象不一定equals(),equale()返回true的两个对象一定相同。

toString()

toString()返回一个String对象,用来标识自己 。

getClass()

getClass()返回一个Class对象。因为返回的是一个class对象,后面可以跟class类的方法。用的是谁的构造函数,那么getClass返回的就是谁的类型,getClass()经常用于java反射机制。

finalize()

这个函数在进行垃圾回收的时候会用到,匿名对象回收之前会调用到。

上一篇 下一篇

猜你喜欢

热点阅读