Java19 双列集合
键值对对象又叫Entry对象.

map是一个接口.

put方法的返回值:如果添加了重复的key,那么就会返回旧的value. 如果只是单纯的添加,没有覆盖什么,那么返回null
删除的返回值:返回删除的值对应的value.
遍历方式
keySet

因此我们遍历keySet,然后得到对应的value就得到.
第二种:获得键值对Entry,然后利用getKey,getValue.
map底下有个内部接口:
这样可以得到Entry对象:
如果没有使用Map. 那么就需要导包
最后的遍历方法:

第三种:Lambda表达式
我们可以看看forEach的底层:其实就是调用action的accept.
而这是一个函数式接口:
因此可以:
因此可以换成lambda:

HashMap 底层是存Entry的HashSet. 如果键存储的是自定义对象,那么我们需要重写hashCode和equals方法.因为底层就是通过key的hashCode和equals方法处理的.
LinkHashMap 和LinkHashSet类似.

TreeMap 和 TreeSet一样.
源码:
tip:IDEA出现了这个图,说明什么?
那个向上的箭头表示重写的Map方法,向右的箭头表示继承的Map方法.
冒号表示返回值.括号内表示参数.
粉色圈出的是method.
(实际上,m表示Method,C表示class,f表示field,I 是iterator)
hashMap分析:
Node:
这是因为hash表当中存储的是node(拉链法中链表的node)
当然,TreeMap是TreeNode:

ps:我们可以看到继承了LinkedHashMap的Entry.事实上,LinkedHashMap的Entry继承了hashMap的Node 这么做是为什么?因为实际上TreeNode也是一种hashMap的Node.为什么这么设计?因为在hashMap的数组当中,有时候要存node节点,有时候需要存红黑树节点. ps:实际上,一开始hashMap空参构造的时候,并不会把底层的数组创建.第一次put的时候才会. ps:默认加载因子是0.75 ps:我们之前说可能哈希碰撞.但事实上,在底层,如果判断哈希值相等,还会额外用一次equals判断是否真的是同一个元素,因此不需要担心哈希碰撞. ps:如果put时已经有了key一样的节点了,那么并不是会把老节点删掉,而是直接修改老节点的value.
treemap分析:
核心:
当然,addEntry里面就会进行红黑树调整.
ps1:不需要重写hashCode和equals方法.
ps2:hashMap里有红黑树,但是需要实现compareable吗?不需要,因为内部默认使用哈希值的带下进行创建红黑树的/
有没有可以重复键的方法?有的,如hashMap的:
这个方法就能.
这是一般的put方法:
区别就是第四个参数.这个参数表示重复时是否覆盖.
TreeMap中也有.
但是这两种都不常见.
可变参数 JDK5
打印出来就是地址值.
既然是数组,就能这样:
细节:
事实上,直接给可变参数传一个数组,也是可以的.这个特征叫做自动装箱拆箱.
Collections 集合工具类
addAll只能添加单列集合.
这两个很常用,其余的不常用:

既然是工具类,这样调用:

不可变集合:
让集合中的内容不可变.
tip:ctrl + alt + v 自动填充函数调用的的左边
细节:
Set没有次数的限制,因为其of传的是可变参数.为什么map没有这么设计?
如果设计了之后,那么就会导致违反可变参数规则的问题.
如果想传递大量的键值对,那么就可以往set当中传entry
样例:
然后:
这样太麻烦了,直接写:
还是麻烦:
这是JDK10的.这样就可以直接写:
