Node与Entry、EntrySet三者之间的关系
Entry这个集合中包含两类,一类是Set类型的KeySet,用来存放Key值,另一类是存放在value值,然后他们里边各自的值存放的是地址,一个指向真正Node节点的key和value的地址;也就是说数据只有一份,(参照下面的图片)存放在左边的HashMap$Node,而右边的Entry中有Set和Collection只是分别存放了key和value 的引用,为了方便去遍历,底层是这样的EntrySet<Entry<K,V>> 也就是
transient Set<Map.Entry<K,V>> entrySet;
这是创建节点的代码:tab[i] = newNode(hash, key, value, null);
实际上Set<Map.Entry<K,V>> 中的K是指向上边的key,V是指向上边的value,这只是一个简单的指向,也只是为了遍历方便而已
entrySet中,定义的类型是Map.Entry,但是实际上存放的还是HashMap$Node,Node是Entry接口的实现类

static class Node<K,V> implements Map.Entry<K,V> { }
从下边这段代码可以得知,HashMap底层维护的Set<Map.Entry<K,V>> entrySet存储的是HashMap$EntrySet,而这个EntrySet集合里边存储的是HashMap$Node,并且Node是Entry接口的实现类
entrySet内部类存储了node节点的引用,返回一个集合,方便遍历
entrySet是个方法,entry是个接口,只有set是集合,set<Map.entry>,又因为Node是个链表,实现了entry接口,所以通过多态,可以认为set集合里存放了Node
Entry提供了两个方法,getKey(),getValue()
存的是newNode(hash, key, value, null),会转换为entry,然后会放在entrySet里边,
HashMap hashMap = new HashMap();
hashMap.put("1","a");
hashMap.put("2","b");
Set set =hashMap.entrySet();
System.out.println(set.getClass()); // class java.util.HashMap$EntrySet
for (Object o : set) {
System.out.println(o.getClass()); // class java.util.HashMap$Node
// 为了从HashMap$Node 取出k,v
Map.Entry o1 = (Map.Entry) o;
System.out.println(o1.getKey() + "-" + o1.getValue());
}
entrySet里边存放的引用地址,指向table里的node,最终的目的是为了能直接使用get获取key和value,遍历

HashMap底层是数组+链表+红黑树实现的,为了方便管理,也在底层做了控制,将node封装成entry,在把entry放到entrySet里边,主要是为了方便管理,除此之外,还提供了keySet方法,可以只获取key,也就是单独取出所有的key 存放在keySet集合,还有values集合,这些又是HashMap的内部类,可以通过以下的方式进行获取
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uFdrdac2-1655358406985)(a-java集合框架.assets/image-20220615234143813.png)]](https://img-blog.csdnimg.cn/e02127f937684adab789438ccd9c2186.png)
以上仅为个人见解,如有误解,欢迎在评论区指正