Java中Map类总结

 

  java编程语言中,Map接口的子接口及其实现类的重要性不言而喻,在这里将其进行总结。


  1. ConcurrentHashMap 是一个线程安全的Hash Map,其由Segment数组结构和HashEntry数组结构组成。ConcurrentHashMap可以做到读取数据不加锁,并且其内部的结构可以让其在进行写操作的时候能够将锁的粒度保持地尽量地小,不用对整个ConcurrentHashMap加锁。 具体解释可以参考:http://www.open-open.com/lib/view/open1345475588251.htmlhttp://www.2cto.com/kf/201212/175024.html

  2. ConcurrentSkipListMap 是TreeMap的线程安全版本,其基于一种叫做Skip List(跳表)的数据结构。Skip List是一种可以代替平衡树的数据结构,默认是按照Key值升序的。Skip List让已排序的数据分布在多层链表中,以0-1随机数决定一个数据的向上攀升与否,通过"空间来换取时间"的一个算法,在每个节点中增加了向前的指针,在插入、删除、查找时可以忽略一些不可能涉及到的结点,从而提高了效率。其与ConcurrentHashMap 的不同主要有一下几个方面:a. ConcurrentSkipListMap 的key是有序的; b. ConcurrentSkipListMap 支持更高的并发。ConcurrentSkipListMap 的存取时间是log(N),和线程数几乎无关。也就是说在数据量一定的情况下,并发的线程越多,ConcurrentSkipListMap越能体现出他的优势;c. 在并发量相同且不是很高的前提下,ConcurrentHashMap 存取速度更快一些。进一步了解可以参考:http://blog.sina.com.cn/s/blog_630c58cb01015rmn.html

  3. EnumMap 是专门为枚举类型量身定做的Map实现。需要注意的是:a. key必须是enum类型;b. key不能为null; c. EnumMap内部以数组实现,性能更好; d. EnumMap在内部使用枚举类型的ordinal()得到当前实例的声明次序,并使用这个次序维护枚举类型实例对应值在数组的位置。

  4. IdentityHashMap 也是非线程安全的Map实现类。利用Chaining Hash 来实现,在判断key是否已经存在是,只是当两个key严格相等时,即key1==key2时,它才认为两个key是相等的 。IdentityHashMap也允许使用null(包括值与键),但不保证键值对之间的顺序。此类比 HashMap(它使用链 而不使用线性探头)能产生更好的性能。实现原理参考:http://oopweb.com/Algorithms/Documents/PLDS210/Volume/hash_tables.html

 5. TreeMap 是以红黑树数据结构来进行实现,因而可以保证当需要快速检索指定节点,它也是非线程安全的,插入的元素都是按一定顺序排序的(其中key不允许为null,value可以是null),可自定义比较的方法。get、put以及remove的时间复杂度为O(log(n))。有关TreeMap实现以及红黑树等问题可以参考:http://blog.csdn.net/jzhf2012/article/details/8540713http://www.cnblogs.com/liqizhou/archive/2012/09/27/java%E4%B8%ADtreemap%E5%92%8Ctreeset%E5%AE%9E%E7%8E%B0%E7%BA%A2%E9%BB%91%E6%A0%91.html

 6. WeakHashMap 也是非线程安全的,在这种Map中存放了键对象的弱引用,当一个键对象被垃圾回收器回收时,那么相应的值对象的引用会从Map中删除。WeakHashMap能够节省存储空间,可用来缓存那些非必须存在的数据。key\value都允许为null,WeakHashMap是无序的。确保值对象不会直接或间接地强引用其自身的键。具体参考http://www.jb51.net/article/36948.htm

 7. HashMap 实际上是一个数组和链表的结合体,内部存储结构是数组,默认初始化为16长度的Entry[](Entry为内部类,它用来存储key-value对),对于hash冲突采用拉链方法解决。它也不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。需要注意的是:a. 如果使用HashMap做数据缓存要考虑数据量大小,如果量大则占用内存,性能也会受到影响,可以考虑会其它cache替代,oscache、ehcache或分布式缓存memcached等; b. 对象做key时最好注意下是否需要重写hashCode和equals,但要避免代码不合理引起的hash冲突; c. 尽量避免遍历map; d. key为数字时使用考虑使用ArrayList,或与ArrayList配合使用寻求高效。相关参考:http://blog.shilimin.com/219.htmhttp://www.iteye.com/topic/539465/

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值