JavaSE_4_集合

1、Map和ConcurrentHashMap的区别?

Map和ConcurrentHashMap的区别,Map是接口,ConcurrentHashMap是实现类

2、hashMap内部具体如何实现的?

HashMap基于哈希思想,实现对数据的读写,底层采用数组+链表实现,可以存储null键和null值,线程不安全:

  • 当我们往HashMap中put元素时,先根据key的hashCode重新计算hash值,然后根据得到的hash值通过hash&(tab.length–1)计算出对应的数组下标,如果数组该位置上已经存放有其他元素了,那么新元素将以链表的形式按照头插法存入链表,如果数组该位置上没有元素,就直接将新元素放到此数组中的该位置上,当存储的链表长度大于8时会将链表转换为红黑树;(hash方法根据key的hashCode重新计算一次散列,该算法加入了高位计算,防止低位不变,高位变化时,造成的hash冲突)
  • 当我们从HashMap中get元素时,先计算key的hashCode,找到数组中对应位置的某一元素,然后通过key的equals方法在对应位置的链表中找到需要的元素;
  • 当HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,所以为了提高查询的效率,就要对HashMap的数组进行扩容,当HashMap中元素个数超过(数组大小*加载因子)时,就会进行数组扩容,数组大小默认值为16,加载因子默认值为0.75,把数组的大小扩展为原来的2倍,然后重新计算每个元素在数组中的位置,这是一个非常消耗性能的操作,所以如果我们已经预知HashMap中元素的个数,那么预设数组的合适长度能够有效的提高HashMap的性能。

3、如果hashMap的key是一个自定义的类,怎么办?

要重写equals方法和hashcode方法,以保证equals相等的对象其hashcode一定也相等。

4、ArrayList和LinkedList的区别,如果一直在list的尾部添加元素,用哪个效率高

ArrayList底层时数组实现的,LinkedList底层是双向链表实现的,ArrayList执行修改和查找的效率比较高,LinkedList执行增加和删除的效率比较高。

如果一直在list尾部增加元素,ArrayList效率更高,但是如果需要在指定位置添加元素时,LinkedList效率更高。

5、请你解释HashMap的容量为什么是2的n次幂?

  • HashMap默认大小为16,又是以原大小的2倍进行扩容,所以默认情况下,HashMap的容量总是2的n次幂;
  • 如果HashMap初始化大小不是2的n次幂也会自动将传入容量转换为2的n次幂,因为计算HashMap下标的求余操作(hash%length)效率不高,源码中优化成了与操作(hash&(length-1)),但是这两个操作能等价的前提是length为2的n次幂。

6、ConcurrentHashMap锁加在了哪些地方?

猜你喜欢

转载自www.cnblogs.com/liumilk/p/10654299.html
今日推荐