• HashMap底层实现原理及问题


    什么是HashMap?你为什么用到它?”
    几乎每个人都会回答“是的”,然后回答HashMap的一些特性,譬如HashMap可以接受null键值和值,而Hashtable则不能;HashMap是非synchronized;HashMap很快;以及HashMap储存的是键值对等等
    HashMap的数据结构:
          最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外。
          HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。HashMap底层就是一个数组结构,数组中的每一项又是一个链表。当新建一个HashMap的时候,就会初始化一个数组,map数组中的对象就是一个key-value对!
     HashMap是基于哈希表的Map接口的非同步实现。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。
     HashMap的工作原理(key-value对在HashMap中是如何存储的):HashMap是基于hashing的原理,我们使用put(key, value)存储对象到HashMap中,使用get(key)从HashMap中获取对象。当我们给put()方法传递键和值时,我们先对键调用hashCode()方法,返回的hashCode用于找到bucket位置来储存Entry对象
     
    当我们往HashMap中put元素的时候,先根据key的hashCode重新计算hash值,根据hash值得到这个元素在数组中的位置(即下标),如果数组该位置上已经存放有其他元素了,那么在这个位置上的元素将以链表的形式存放,新加入的放在链头,最先加入的放在链尾。如果数组该位置上没有元素,就直接将该元素放到此数组中的该位置上。
     
    二、HashMap和Hashtable实现类:
    1、HashMap与HashTable的区别:
    1) 同步性:Hashtable是同步的,这个类中的一些方法保证了Hashtable中的对象是线程安全的。而HashMap则是异步的,因此 HashMap中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用HashMap是一个很好的选择,这 样可以避免由于同步带来的不必要的性能开销,从而提高效率。
    2) 值:HashMap可以让你将空值作为一个表的条目的key或value,但是Hashtable是不能放入空值的。HashMap最多只有一个key值为null,但可以有无数多个value值为null。
    2、性能:HashMap的性能最好,HashTable的性能是最差(因为它是同步的)
    3、注意:
    1)用作key的对象必须实现hashCode和equals方法。
    2)不能保证其中的键值对的顺序
    3)尽量不要使用可变对象作为它们的key值。
     

    Map(采用键值对<key,value>存储元素,key键唯一):

    hashmap:底层结构是数组+链表,无序,线程不安全,效率高,允许有null(key和value都允许),父类是AbstractMap

    treemap:底层结构是红黑树,有序,将数据按照key排序,默认是升序排序。

    hashtable:底层结构是哈希表,无序,线程安全,效率低,不允许有null值,父类是Dictionary

     
    三、LinkedHashMap:
    它的父类是HashMap,使用双向链表来维护键值对的次序,迭代顺序与键值对的插入顺序保持一致。LinkedHashMap需要维护元素的插入顺序,so性能略低于HashMap,但在迭代访问元素时有很好的性能,因为它是以链表来维护内部顺序。
     
    四、TreeMap:
    Map接口派生了一个SortMap子接口,SortMap的实现类为TreeMap。TreeMap也是基于红黑树对所有的key进行排序,有两种排序 方式:自然排序和定制排序。Treemap的key以TreeSet的形式存储,对key的要求与TreeSet对元素的要求基本一致。
    1、Map.Entry firstEntry():返回最小key所对应的键值对,如Map为空,则返回null。
    2、Object firstKey():返回最小key,如果为空,则返回null。
    3、Map.Entry lastEntry():返回最大key所对应的键值对,如Map为空,则返回null。
    4、Object lastKey():返回最大key,如果为空,则返回null。
    5、Map.Entry higherEntry(Object key):返回位于key后一位的键值对,如果为空,则返回null。
    6、Map.Entry lowerEntry(Object key):返回位于key前一位的键值对,如果为空,则返回null。
    7、Object lowerKey(Object key):返回位于key前一位key值,如果为空,则返回null。
    8、NavigableMap subMap(Object fromKey,boolean fromlnclusive,Object toKey,boolean toInciusive):返回该Map的子Map,其key范围从fromKey到toKey。
    9、SortMap subMap(Object fromKey,Object toKey );返回该Map的子Map,其key范围从fromkey(包括)到tokey(不包括)。
    10、SortMap tailMap(Object fromkey ,boolean inclusive):返回该Map的子Map,其key范围大于fromkey(是否包括取决于第二个参数)的所有key。
    11、 SortMap headMap(Object tokey ,boolean inclusive):返回该Map的子Map,其key范围小于tokey(是否包括取决于第二个参数)的所有key。

  • 相关阅读:
    sqlserver日期推算
    bcp sqlserver 导入 导出 数据
    sqlserver 2008 序列号
    mysql 学习总结
    使用Eclipse对JUnit测试函数进行Debug时断点无效问题
    ORACLE死锁故障排查的一般性手法的备忘录
    BigDecimal进行Format时产生的[java.lang.IllegalArgumentException: Digits < 0]异常
    Java中keySet()返回值的排序问题
    严蔚敏数据结构视频教程下载
    C、C++经典书籍
  • 原文地址:https://www.cnblogs.com/aitree/p/14446079.html
Copyright © 2020-2023  润新知