HashMap的特点:
- 允许使用null键和null值,与 HashSet一样,不保证映射的顺序。
- 所有的key构成的集合是set:无序的、不可重复的。所以,key所在的类要重写equals()和 hashCode()
- 所有的value构成的集合是Collection:无序的、可以重复的。所以,value所在的类要重写:equals()
- 一个key-value构成一个entry,所有的entry构成的集合是Set:无序的、不可重复的
- HashMap判断两个key相等的标准是:两个key通过equals()方法返回true,hashCode值也相等。
- HashMap判断两个value相等的标准是:两个value通过equals()方法返回true。
- HashMap的底层: 数组+链表 (JDK 7.0及之前)
数组+链表+红黑树 (JDK 8.0以后)
HashMap实现原理:jdk7.0
HashMap中主要存储着一个Entry的数组table,Entry就是数组中的元素,Entry实现了Map.Entry所以其实Entry就是一个key-value对,并且它持有一个指向下一个元素的引用,这样构成了链表
HashMap的put方法
HashMap的扩容
当HashMap中的元素越来越多的时候,hash冲突的几率也就越来越高,因为数组的长度是固定的。
所以为了提高查询的效率,就要对 HashMap的数组进行扩容,而在HashMap数组扩容之后,原数组中的数据必须重新计算其在新数组中的位置,并放进去,这就是 resize。
默认情况下,数组大小为16,那么当HashMap中元素个数超过16