1,HashMap
hashmap数据结构为一个hash表,具体的代码实现就是一个数组,每个数据里面存放一个链表,初始化的时候默认的数组大小为16,负载因子为0.75(这个值可以保证碰撞最低并且空间利用率最高),当元素的个数大于(负载因子*数组长度)的时候,会进行数组扩容,扩大为2倍(所以当内存比较吃紧的时候,可以适当地增加负载因子,当内存很充足的时候,可以减少负载因子)。前面的叙述是针对jdk7及以下版本的,jdk8的hashmap稍稍做了一些改变,就是当数组中的链表达到一定的阈值的时候,这个链表会转化成一颗红黑树,这个优势就很明显了,在红黑树里面查询一个数据可比在链表中查询效率高多了。
2,TreeMap
可以说不论是添加操作,还是查找操作,treeMap的效率都没有hashMap高,因为在操作之前他们都是需要定位的,而hashMap只需要算出hash值就可以找到相应的数组小标,从而定位到相应的位置,而treemap是需要从树的顶端往下寻找,时间复杂度为log(n),那这个treemap的价值是什么呢?别忘了treemap实现了一个接口叫做SortedMap,也就说treemap是一个有序的map,当你需要按顺序输出一组数据的时候就可以选择treemap了。
treemap的内部数据结构是红黑树(R-B Tree),这颗树比一般的查询二叉树的优势就是查询这个树的时间复杂度为log(n),而一般普通的查询二叉树的查询时间复杂度很可能为O(n)(最次的情况)。
3,WeakHashMap
WeakHashMap,从单词的含义就能看出来,是弱hashmap,他的弱指的就是存入的对象引用的强度,我们知道对象引用强度分四个级别:强引用 、软引用、弱引用、虚引用,二这个弱指的就是弱引用。
那么WeakHashMap是怎么实现这个弱引用的呢?首先在他的Entry内部类继承了WeakReference类,并且在构造方法中调用了这个类的构造方法,super(key,queue),这个queue是WeakHashMap内部的一个referenceQueue,这个queue是专门存放弱引用对象的key的,当WeakHashMap调用expungeStaleEntries的时候,会将queue中存放的key的键值对从WeakHashMap中删除掉
4,Hashtable
Hashtable跟hashmap的内部结构基本一样也是hash表,就是一个数组,每个数组里面是一个链表,不同的大概有这么几点:
(1)初始的数组大小为11,hashmap的初始数组大小为16,
(2)hashtable是线程安全的,因为hashtable里面的一些并发方法都是由synchronized修饰的
来源:oschina
链接:https://my.oschina.net/u/1169535/blog/415642