[java] 常用map的比较

来源:互联网 发布:自由行网站 知乎 编辑:程序博客网 时间:2024/06/05 16:59

最近改代码的时候想要找一个get 和 put 方法效率比较的map,所以常看了1.6的api,现作出如下的比较:

 

LinkedHashMap

HashMap

TreeMap

IdentityHashMap

EnumMap

实现原理

1.       双向列表和hash

2.       维护了一个key的双向列表

3.        

hash

红黑树

使用引用相等的比较法则,而不是对象相等,也就是引用的要是内存中的统一物理地址

chaining hash 实现(http://oopweb.com/Algorithms/Documents/PLDS210/Volume/hash_tables.html

1.       key的值必须是统一个枚举类型

2.       数组实现

线程安全

元素的顺序

1.       KEY的遍历顺序就是插入的顺序

2.       重新插入同一个key值是不会影响它的位置

3.        

元素的顺序不一定一直一样

插入的元素都是按一定顺序排序的,可自定义比较的方法

元素的顺序不一定一直一样

元素的顺序万为枚举类型声明的顺序

一致性

iterator被创建后,除了通过iterator的方法修改map,其他形式的修改都会导致iteratorConcurrentModificationException的异常,但是这个也不是可靠的

iterator被创建后,除了通过iterator的方法修改map,其他形式的修改都会导致iteratorConcurrentModificationException的异常,但是这个也不是可靠的

iterator被创建后,除了通过iterator的方法修改map,其他形式的修改都会导致iteratorConcurrentModificationException的异常,但是这个也不是可靠的

iterator被创建后,除了通过iterator的方法修改map,其他形式的修改都会导致iteratorConcurrentModificationException的异常,但是这个也不是可靠的

创建iterator后改变map的值,也不会有异常,一致性不能保证

key value的取值

允许key valuenull

允许key valuenull

key不允许为nullvalue可以是null

允许key valuenull

不允许key nullvalue可以为null

其他

用这个map重新生成一个key顺序一样的map,不管这个map的实现是什么,如(new LinkedHashMap(XXXMap)),这样生成的map元素顺序和原来一致

1.       初始的容量和负载因子影响性能,默认的负载因子是0.75,增大这个值减少了使用的空间,但是增加了get set 的时间

2.       get put 的时间复杂度为O(1)

1.       get put remove的时间复杂度为O(log(n))

1.       Map的大小是重要的性能指标,如果超过map最大的范围,那么要花很大的代价去加长这个map

2.       HashMap性能好