第十三章 集合2
12.HashMap
1.HashMap阶段小结
2.HashMap底层机制
里面存放的元素全是HashMap $ Node对象(k1,v1)等,
他们都实现了Map$Entry的接口。
3.HashMap源码解读
4.HashMap扩容树化触发
这加到第8个,此时还没有进行树化,下面加第9个的时候,先进行扩容,table
的大小此时变为32
下面再加一个,到第10个,此时还没有进行树化,table继续进行扩容,
长度变为64
此时虽然链表的hash值没有变化,但是整条链表做了一个移动
此时再进行添加,就会树化了,变为TreeNode
13.Hashtable
1.Hashtable使用
2.Hashtable扩容
Hashtable的底层就是一个Entry数组
当到达临界值的时候以两倍加一的方式进行扩容
3.HashMap与Hashtable对比
14.Properties
15.集合选型规则
LinkedhashMap的底层就是LinkedHashMap,
而LinkedHashMap的底层就是HashMap
16.TreeSet源码解读
下面就是先向下转型为String类型,再调用String类的compareTo方法
如果想要反过来进行输出
下面看源码
如果我们想要按照长度的大小进行排序(从大到小)
如果想要从小到大
这种情况下想要加入一个“abc”是加不进去的,因为tom与abc的大小全是3,
相减为0,根据底层的源码,是加不进去的
17.TreeMap源码解读
默认情况下是无序的
按照key中String的大小进行排序
下面按照字符串长度的大小进行排序
下面对源码进行解读
以前的HashMap的值相等不相等是由equals来决定的,而这里的TreeSet的值相不相等是由compare方法来决定的
18.Collections工具类
1.collections工具类1
reverse反转list中元素的顺序
ArrayList本身是有序的
shuffle对list集合元素进行随机排序
每次执行完的结果都是不一样的
第一次执行
再次执行
下面循环执行,查看效果
Sort
自然排序就是按照字符串的大小进行排序的
如果想要指定排序,则可以使用Comparator,
比如下面我们希望按照字符串的长度大小进行排序
swap交换元素
2.collection工具类2
max
如果想要定制排序取出最大值,我们可以使用Comparator
如果要返回最小的,换一下顺序即可
min
与max一模一样
frequency返回集合中指定元素出现的次数
copy
这里会抛出异常,告诉你数组越界了
下面是copy的源码,此时我们的dest数组还是空的,所以会有越界异常
replacedAll
19.本章作业
1.本章作业1
其中的双引号我们需要添加转义符
ArrayList不是数组,要使用get方法
2.本章作业2
add
remove
contains
size
isEmpty / clear
addAll
containsAll
removeAll
3.本章作业3
放置650的时候会做一个自动装箱的动作,我们放入其中的数据不是int型的,而是integer型的。
这里的key是Object类型,需要进行一个向下转型将其变为integer类型。
4.本章作业4
这里的Person类没有实现Comparable接口,所以会报错
继承这个并实现接口方法就可以
此时我们再运行,会有Person对象在其中
如果此时我们再继续添加Person对象,那么我们的集合中也只有一个Person对象,因为我们的继承的CompareTo方法返回的是一个0,它永远都相等。
下面我自己写的
5.本章作业5
这里的set.remove(p1)不会成功,因为在remove的时候会重新hash一个新的位置,本在的p1的位置可能在1,但remove的时候可能就3,它找不到p1,所以此时删除会失败。
所以下面的会输出2个对象。
同样的道理,下面的set.add()添加会成功,因为它会重新hash一个新的位置,比如存储到位置3。所以下面会输出3个对象。
再下面的set.add()会添加到位置1,因为前面已经添加过一模一样的(1001,“CC”)。
但此时位置1原来的Person对象中的“AA”已经改成了“CC”,所以会挂到后面。
注意:这里一定要按照题目要求重写equals与hashCode方法,即id与name都相同时,Person对象就是相同的。