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方法即可。