Java19 双列集合

键值对对象又叫Entry对象.

1b68de7c0f20c34325c14fd9792f1f9b_MD5

map是一个接口. 604b4d231cfa89355751a6b29fd295b4_MD5

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

删除的返回值:返回删除的值对应的value.


遍历方式

keySet cc680719b3a0647f4fb9e68ec8bc5dc0_MD5

因此我们遍历keySet,然后得到对应的value就得到.

第二种:获得键值对Entry,然后利用getKey,getValue. map底下有个内部接口: 0b1a29df651c99ecd62e4ceafe40e70f_MD5 这样可以得到Entry对象: cfc903c6e1717a54e07aad3086d0fb5f_MD5 如果没有使用Map. 那么就需要导包 58f7f8cddf0d0cac91917d8b09114b1a_MD5 最后的遍历方法: 6841a19f2b41e7426e80cc4210bb575c_MD5

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


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

LinkHashMap 和LinkHashSet类似.


581c2cc5a5da372e658be8f447051078_MD5

TreeMap 和 TreeSet一样.


源码:

tip:IDEA出现了这个图,说明什么? 0b81ee1009aa2b086ea361d3a5a2da5c_MD5 那个向上的箭头表示重写的Map方法,向右的箭头表示继承的Map方法. 冒号表示返回值.括号内表示参数. 粉色圈出的是method. (实际上,m表示Method,C表示class,f表示field,I 是iterator)

hashMap分析: Node: 8774f003bd0a47494e36f4f23c2718b7_MD5 这是因为hash表当中存储的是node(拉链法中链表的node) 当然,TreeMap是TreeNode: a2686706ec3877547f20ebc88fccb89c_MD5

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分析: 核心: 1747026dda317dcfbfc057dd87c333e8_MD5 当然,addEntry里面就会进行红黑树调整. ps1:不需要重写hashCode和equals方法. ps2:hashMap里有红黑树,但是需要实现compareable吗?不需要,因为内部默认使用哈希值的带下进行创建红黑树的/


有没有可以重复键的方法?有的,如hashMap的: 92513d5a526d9cc4122a633bdba4d3ce_MD5 这个方法就能. 这是一般的put方法: d11caddc4cc133b5de7c64636a55455c_MD5 区别就是第四个参数.这个参数表示重复时是否覆盖. TreeMap中也有. 但是这两种都不常见.


可变参数 JDK5 4990292e112e0e51345cabc7130a5f66_MD5 打印出来就是地址值. 既然是数组,就能这样: 5330d2e228325bfb6f73c9b46d08965b_MD5 细节: e2b581a99079534946d25b709495ecd7_MD5 事实上,直接给可变参数传一个数组,也是可以的.这个特征叫做自动装箱拆箱.


Collections 集合工具类 454b8c0176f1cd3b93fe823a52b1134e_MD5 addAll只能添加单列集合. 这两个很常用,其余的不常用: 870faa8d24e1f2d8aa08d758dd92054b_MD5

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


不可变集合: 让集合中的内容不可变. 9055ba922c13ec3eac9917e04666a9f9_MD5 tip:ctrl + alt + v 自动填充函数调用的的左边 515047772f3a46adfd0fa55a8c2ad8c0_MD5 细节: 8f66dadfab54359c02c2dbafb804edc1_MD5 690e6be1e1dd5f574119dc476499b6c0_MD5 Set没有次数的限制,因为其of传的是可变参数.为什么map没有这么设计? cb9b595776618974c754dfa1d005b0b1_MD5 如果设计了之后,那么就会导致违反可变参数规则的问题. 如果想传递大量的键值对,那么就可以往set当中传entry 50a403f45dfa1d05cb3046fb50b38b73_MD5 189a8b7f976ee5c61bec106f5865c8c3_MD5 样例: c49173f78e93c802a518f66b5c9ff8c4_MD5 然后:290bfbf4b192835788a208e3374e5ca4_MD5

这样太麻烦了,直接写: 508bfbc0d5f464e3b14957cca3f43f95_MD5 还是麻烦: f83bdb3cd27e8b395508d995772566ab_MD5 这是JDK10的.这样就可以直接写: 6f1f5df697124c029205684f0a5514d4_MD5