浅谈java面试题hashmap,hashtable,treemap,linkedhashmap的区别

浅谈java面试题hashmap,hashtable,treemap,linkedhashmap的区别

#先谈谈hashmap的实现原理(其他的都是在hashmap的基础上实现的,他们都是属于map接口下的实现类)

hashmap的实现是基于数组+链表+红黑树实现的
hashmap是通过键和值得方式来存储数据的,至于他的实现原理如下:
首先,hashmap中基于数组实现,数组的长度默认为16,加载因子默认为0.75(即当数组内存空间达到百分之75时代表空间已经满了,就需要扩容,而扩容的算法是数组原先大小*2),通过计算key键的hash值,将其hash值和数组的初始大小16取%然后得到的值就是key存储在数组中的位置。(比如key的值为int类型int a=1,因为int类型的hashcode()值为他本身,所以a在数组中的位置是1%16等于1,在数组中存在1索引),然后当多个key的位置都在一个地方时,即这个位置有多个对象,那么就用链表存储,在jdk1.8之后当链表长度大于8时就用红黑树实现。
HashMap类中关键方法
final void putMapEntries(Map<? extends K, ? extends V> m, boolean evict) {
int s = m.size();
if (s > 0) {
if (table == null) { // pre-size
float ft = ((float)s / loadFactor) + 1.0F;
int t = ((ft < (float)MAXIMUM_CAPACITY) ?
(int)ft : MAXIMUM_CAPACITY);
if (t > threshold)
threshold = tableSizeFor(t);
}
else if (s > threshold)
resize();
for (Map.Entry<? extends K, ? extends V> e : m.entrySet()) {
K key = e.getKey();
V value = e.getValue();
putVal(hash(key), key, value, false, evict);
}
}
}

掌握hashmap原理后,下面谈谈这几个的区别

hashmap

       key值允许为空,并且只能有一个key值为空,value值可以有多个为空,
       hashmap中存的数据是无序的,遍历是随机的 
       hashmap线程不安全,不适合多线程程序
       遍历速度快

hashtable

       不允许key和value的值为空
       线程是安全的,适合多线程程序
       相较于hashmap,hashtable的数组扩充算法为*2+1,原数组大小为11

TreeMap

       适用于排序时 ,可以按照一定的顺序来存值,可以把保存的记录根据键来排序
       基于二叉树的红黑树来实现

LinkedHashMap

       保存了记录的插入顺序, 存的数据是有序的,遍历时显示数据的顺序即存储时的顺序
       速度比hashmap慢
       当需要输出和输入相同时用 LinkedHashMap

猜你喜欢

转载自blog.csdn.net/qzw5235641/article/details/83830110