HashMap是Maop接口的主要实现类之一
使用说明:
-
允许使用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。
-
JDK8之前HashMap的内部存储结构其实是数组和链表的结合。JDK8:HashMap的内部存储结构其实是数组+链表+树的结合。
HashMap添加元素的过程:
向HashMap中添加entry1(key,value),需要首先计算entry1中key的哈希值(根据 key所在类的hashCode()计算得到),此哈希值经过处理以后,得到在底层Entry[]数 组中要存储的位置i。如果位置i上没有元素,则entry1直接添加成功。如果位置i上 已经存在entry2(或还有链表存在的entry3,entry4),则需要通过循环的方法,依次 比较entry1中key和其他的entry。如果彼此hash值不同,则直接添加成功。如果 hash值不同,继续比较二者是否equals。如果返回值为true,则使用entry1的value 去替换equals为true的entry的value。如果遍历一遍以后,发现所有的equals返回都 为false,则entry1仍可添加成功。entry1指向原有的entry元素。