稀土 2018-04-16
HashMap是基于哈希表的Map接口的实现,HashMap是一个散列表,存储的内容是键值对(key-value)映射,键值对都可为null;
HashMap继承自AbstractMap<K, V> 并实现Map<K, V>, Cloneable, Serializable接口;
HashMap不是同步的,不是线程安全的;
HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。底层是个数组,数组上存储的数据是Entry<K,V>类型的链表结构对象。
HashMap和HashTable都实现了Map接口,主要区别有,线程安全性,同步(synchronize)和速度;
HashMap可以接受空的键值对而HashTable不行;
HashMap是非synchronize而HashTable是synchronize,意味着HashTable是线程安全的,多个线程可以公用一个HashTable;如果没有正确的同步,多个线程不能共享HashMap;
由于HashTable是线程安全的也是synchronize的,在单线程的环境下它比HashMap慢;
HashMap不能保证随着时间的推移Map中的元素的位置不变
HashMap基于哈希原理,可以通过put和get方法存储和获取对象。当我们将键值对传递给put方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到对应的bucket位置存储键对象和值对象作为Map.Entry;如果两个对象的hashcode相同,所以对应的bucket位置是相同的,HashMap采用链表解决冲突碰撞,这个Entry(包含有键值对的Map.Entry对象)会存储到链表的下一个节点中。HashMap在每个链表节点中存储键值对对象。当使用get()方法获取对象时,HashMap会根据键对象的hashcode去找到对应的bucket位置,找到对应的bucket位置后会调用keys.equals()方法去找到连表中对应的正确的节点找到对象。
参考资料:http://www.importnew.com/7099.html,https://www.cnblogs.com/skywang12345/p/3310835.html