HashMap、TreeMap、LinkedHashMap、hashtable的区别

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能够实现,它还能够按读取顺序来排列,像链接池中能够应用。
java

 

额外的补充:算法

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方法循环比较链上的每个对象spa

       才能够真正定位到键值对应的Entry.线程

   c. put时,若是hash表中没定位到,就在链表前加一个Entry,若是定位到了,则更换Entry中的value,并返回旧value对象

4. 因为TreeMap须要排序,因此须要一个Comparator为键值进行大小比较.固然也是用Comparator定位的.排序

   a. Comparator能够在建立TreeMap时指定

   b. 若是建立时没有肯定,那么就会使用key.compareTo()方法,这就要求key必须实现Comparable接口.

   c. TreeMap是使用Tree数据结构实现的,因此使用compare接口就能够完成定位了


一、Collection没有get()方法来取得某个元素。只能经过iterator()遍历元素。 

二、Set和Collection拥有如出一辙的接口。 

三、List,能够经过get()方法来一次取出一个元素。使用数字来选择一堆对象中的一个,get(0)...。(add/get) 

四、通常使用ArrayList。用LinkedList构造堆栈stack、队列queue。 

五、Map用 put(k,v) / get(k),还可使用containsKey()/containsValue()来检查其中是否含有某个key/value。 

      HashMap会利用对象的hashCode来快速找到key。 

    *     hashing 

          哈希码就是将对象的信息通过一些转变造成一个独一无二的int值,这个值存储在一个array中。 

          咱们都知道全部存储结构中,array查找速度是最快的。因此,能够加速查找。 

      

          发生碰撞时,让array指向多个values。即,数组每一个位置上又生成一个梿表。 

六、Map中元素,能够将key序列、value序列单独抽取出来。 

使用keySet()抽取key序列,将map中的全部keys生成一个Set。 

使用values()抽取value序列,将map中的全部values生成一个Collection。 

为何一个生成Set,一个生成Collection?那是由于,key老是独一无二的,value容许重复。

相关文章
相关标签/搜索