HashMap,TreeMap,WeakHashMap,HashTable

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表,就是一个数组,每一个数组里面是一个链表,不一样的大概有这么几点:hash

(1)初始的数组大小为11,hashmap的初始数组大小为16,

(2)hashtable是线程安全的,由于hashtable里面的一些并发方法都是由synchronized修饰的

相关文章
相关标签/搜索