深入了解HashMap以及源码,HashMap面试问题

一、HashMap

  1. HashMap基于hashing原理,通过put()和get()方法存储和获取对象。当我们将键值对传递给put()时,它会调用键对象的hashCode()方法来计算key对应的hashCode,然后找到对应的bucket位置来存储值对象。当获取值对象时,通过键对象的equal()方法找到正确的键值对,然后返回值对象。HashMap用链表来解决碰撞问题,当碰撞发生了就会将键值对对象存储到链表的下一个节点中。
  2. 当两个不同的键值对对象的hashCode相同时,他们会存储在相同bucket位置的链表上,通过键对象的equal()方法在链表中寻找对应的键值对。

二、HashMap和Hashtable的区别

HashMap和Hashtable均实现了Map接口
3. HashMap是非synchronized的,Hashtable是synchronized的,其是线程安全的,多线程可以共享一个Hashtable,HashMap不行(可以同步处理解决)。
4. 可以接受null->null键对值,但是Hashtable不行。Java5提供了ConcurrentHashMap来代替Hashtable,其扩展性比Hashtable更好。
5. HashMap不能保证随着时间的推移,Map中元素的次序是不变的。
6. HashMap的迭代器是fail-fast迭代器,其他线程修改HashMap结构(增加或者移除元素)时会抛出异常,但可以通过set()方法来修改集合对象,迭代器本身的remove()方法移除元素也是可以的;Hashtable的迭代器(enumerator)不是fast-fail的。
7. sychronized意味着在一次仅有一个线程能够更改Hashtable。就是说任何线程要更新Hashtable时要首先获得同步锁,其它线程要等到同步锁被释放之后才能再次获得同步锁更新Hashtable。
8. HashMap同步的方式:Map m = Collections.synchronizeMap(hashMap);

三、HashMap和HashSet的区别

猜你喜欢

转载自blog.csdn.net/Cxf2018/article/details/109328235