博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HashMap、TreeMap、LinkedHashMap、hashtable的区别 小记
阅读量:6953 次
发布时间:2019-06-27

本文共 2590 字,大约阅读时间需要 8 分钟。

 

Map主要用于存储健值对,根据键得到值,因此不允许键重复(重复了覆盖了),但允许值重复
    hashMap是hashtable的轻量级实现(非线程安全的实现),他们都完成了Map接口,主要区别在于HashMap允许有空键值,由于非线程安全,效率上面可能高于Hashtable。
    HashMap允许将null作为一个entry的key或者value,而hashtable不允许
    hashMap把hashtable的contains方法去掉了,改成了containsvalue和containsKey因为contains方法容易让人引起误解。
    Hashtable继承自Dictionary类,而HashMap是java1.2引进的Map interface的一个实现。最大的不同是,Hashtable的方法是synchronize的,而HashMap不是,在多个线程访问Hashtable时不需要自己为它的方法实现同步,而HashMap就必须为之提供外同步。Hashtable和HashMap采用的has/rehash算法都大概一样,所以性能不会有很大的差异。
    LinkedHashMap保存了记录的插入顺序,在用Iterator遍历LinkedHashMap时,先得到的记录肯定是先插入的.也可以在构造时用带参数,按照应用次数排序。在遍历的时候会比HashMap慢,不过有种情况例外,当HashMap容量很大,实际数据较少时,遍历起来可能会比LinkedHashMap慢,因为LinkedHashMap的遍历速度只和实际数据有关,和容量无关,而HashMap的遍历速度和他的容量有关。
     TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序,也可以指定排序的比较器,当用Iterator 遍历TreeMap时,得到的记录是排过序的。
            一般情况下,我们用的最多的是HashMap,HashMap里面存入的键值对在取出的时候是随机的,它根据键的HashCode值存储数据,根据键可以直接获取它的值,具有很快的访问速度。在Map 中插入、删除和定位元素,HashMap 是最好的选择。 TreeMap取出来的是排序后的键值对。但如果您要按自然顺序或自定义顺序遍历键,那么TreeMap会更好。 LinkedHashMap 是HashMap的一个子类,如果需要输出的顺序和输入的相同,那么用LinkedHashMap可以实现,它还可以按读取顺序来排列,像连接池中可以应用。
 
 
HashMap不会抛出任何异常;TreeMap则会抛出两种异常抛出:ClassCastException - 如果指定键不能与在映射中的当前键进行比较NullPointerException - 如果指定键为 null 并且此映射使用自然顺序,或者其比较器不允许使用 null 键
 
额外的补充:
 
1. HashSet是通过HashMap实现的,TreeSet是通过TreeMap实现的,只不过Set用的只是Map的key
2. Map的key和Set都有一个共同的特性就是集合的唯一性.TreeMap更是多了一个排序的功能.
3. hashCode和equal()是HashMap用的, 因为无需排序所以只需要关注定位和唯一性即可.
   a. hashCode是用来计算hash值的,hash值是用来确定hash表索引的.
   b. hash表中的一个索引处存放的是一张链表, 所以还要通过equal方法循环比较链上的每一个对象
       才可以真正定位到键值对应的Entry.
   c. put时,如果hash表中没定位到,就在链表前加一个Entry,如果定位到了,则更换Entry中的value,并返回旧value
4. 由于TreeMap需要排序,所以需要一个Comparator为键值进行大小比较.当然也是用Comparator定位的.
   a. Comparator可以在创建TreeMap时指定
   b. 如果创建时没有确定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.
   c. TreeMap是使用Tree数据结构实现的,所以使用compare接口就可以完成定位了
 
 
1、Collection没有get()方法来取得某个元素。只能通过iterator()遍历元素。 
2、Set和Collection拥有一模一样的接口。 
3、List,可以通过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get) 
4、一般使用ArrayList。用LinkedList构造堆栈stack、队列queue。 
5、Map用 put(k,v) / get(k),还可以使用containsKey()/containsValue()来检查其中是否含有某个key/value。 
      HashMap会利用对象的hashCode来快速找到key。 
    *     hashing 
          哈希码就是将对象的信息经过一些转变形成一个独一无二的int值,这个值存储在一个array中。 
          我们都知道所有存储结构中,array查找速度是最快的。所以,可以加速查找。 
      
          发生碰撞时,让array指向多个values。即,数组每个位置上又生成一个梿表。 
6、Map中元素,可以将key序列、value序列单独抽取出来。 
使用keySet()抽取key序列,将map中的所有keys生成一个Set。 
使用values()抽取value序列,将map中的所有values生成一个Collection。 
为什么一个生成Set,一个生成Collection?那是因为,key总是独一无二的,value允许重复。
posted on
2016-02-21 11:57 阅读(
...) 评论(
...)

转载于:https://www.cnblogs.com/Jack1ee/p/5204690.html

你可能感兴趣的文章
YUV格式&像素
查看>>
Asp.Net Core 快速邮件队列设计与实现
查看>>
归并排序板子
查看>>
oralce入门学习
查看>>
编程开发之--java多线程学习总结(4)
查看>>
字符串匹配
查看>>
mysql搭建及数据迁移教程
查看>>
Python文档学习笔记(1)--使用Python 解释器
查看>>
myeclipse 8.5安装freemarker插件方法
查看>>
10 款最好的远程桌面软件
查看>>
JxBrowser之四:对Http Response Code的处理
查看>>
Linux课程---3、Linux远程登录和传输(操作Linux服务器软件)
查看>>
前端模板资源
查看>>
不仅仅是Google,您必须知道的全球十大地图API
查看>>
php排序
查看>>
JSP与Servlet之间传值
查看>>
JavaScript&jQuery.动态删除元素
查看>>
pickle和json模块
查看>>
Python基本语法_输入/输出语句详解
查看>>
用 Flask 来写个轻博客 (4) — (M)VC_创建数据模型和表
查看>>