Java的HashMap一层一层深入

1.HashMap结构图

2.问题依次深入

  • 什么是HashMap,它的特性是什么?
    答:
    HashMap由数组和多个LinkedList组成。
    HashMap可以存键值对。
HashMap<T,T> hashmap=new HashMap<T,T>();//声明
hashmap.put(T,T);//放入键值对
hashmap.get(T);//获取值
  • HashMap和HashTable的区别
    HashMap可以存储键值为Null的值。
    HashTable不能存储键值为Null的值。
    HashMap是非同步的,是线程不安全的。
    HashTable是同步的,是线程安全的。
    HashMap默认大小为16,并且一定为2的指数。
    HashTable默认大小为11,并且增长规律为old*2+1。

  • HashMap的工作是什么原理
    put()方法,先使用hashcode()方法计算key的hashcode,然后根据hashcode找到bucket位置,存储Entry对象,如果hashcode和其他的相同,那么使用Linklist,依次存储entry。
    get()方法,使用hashcode()方法得到key的hashcode,然后遍历LinkedList使用key.equal()找出bucket中的具体entry,最后得到值。

  • 什么HashMap的默认容量和负载因子(load factor)
    默认容量为16,负载因子为0.75。

  • 如果HashMap超过了负载因子,这时候该怎么办?
    调用 rehash方法,将默认容量变为2倍的bucket数组,将原来的bucket数组元素放入心得bucket数组中。

  • 为什么使用Double Integer等wrapper 类当做key比较好。
    wrapper类有不可变性的性质,即放入和取出的hashcode不会改变,而且已经重写了equals和hashcode方法。并且如果两个不相等的对象返回不同的hashcode的话,那么碰撞的几率就会小些,这样就能提高HashMap的性能。

  • 可以使用自定义对象作为key吗?
    可以的,满足两个特性:不可变性和重写两个方法。
    当对象插入到Map中之后将不会再改变了。并且重写equals和hashcode方法即可。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容