为什么HashMap的键值对的类型是HashMap$Node类型,是在哪定义的?
键 和 值 的类型 是在 定义 HashMap的时候确定的,
键值对 的存储是在 Node里面,可以看 HashMap的putVal方法,如下:
HashMap底层数据结构是哈希表。
在JDK1.8之前HashMap由数组+链表数据结构组成的。
在JDK1.8及之后HashMap由数组+链表+红黑树数据结构组成的。
HashMap<String,Integer> hm=new HashMap<>();
当创建HashMap集合对象的时候,在jdk8前,构造方法中创建一个长度是16的Entry[] table,用来存储键值对数据
在jdk8以后不是在HashMap的构造方法底层创建数组了,是在第一次调用put方法时创建的数据,Node[] table如下图:
点击put方法的底层可以发现有一个Node[]数组,如下图:
HashMap键值对的类型是通过HashMap$Node类型来定义的,其中K代表键的类型,V代表值的类型。这些类型都可以通过定义HashMap的泛型来指定。在HashMap中,键值对其实是通过一个Node类来实现的,Node类是HashMap的一个静态内部类,实现了Map.Entry接口,拥有hash、key、value和next四个属性。其中,next属性记录了该节点的下一个节点,以此来实现链式寻址法解决哈希冲突。Node节点重写了hashCode() 和equals() 方法来确保哈希表的正确性。