目录
PS:记住这是无序的
其他一些通用性质的方法和list很像,看API文档吧
重写hashcode方法,返回一个int值
判断是否相同,不是一个个遍历用equal判断,是通过哈希code值,模某个余数,然后找到这个位置,或者这个位置后几位,然后再针对这几个hashcode值一样的元素进行判断。
但是注意,如果两个元素hashcode值取模后,余数一样,而且他们的值并不相同,那我们是把它俩放到一个索引下面吗?显然是不能的,那可以往后推一位吗,可以,但是这里不这么做,而是利用链表,即数组加单项链表。
举例:
首先注意 users类的hashcode没有重写哦!!!!!
这里为什么u,u1都可以存进去呢,明明他俩一样的,但是呢,我们一直强调,判断是不是一样,在hashset里面是利用hashcode()来判断的,
所以我们发现这两个u u1的hashcode并不相同,所以在hashset标准下被视为不一样的元素,实际上equals()根本没有执行.
然后我们把users类的hashcode()重写一下试试看:
当然重写的话,equals()也要一起重写的。
然后在equals方法里加了sout"equals..."
结果:
发现这两个元素的hashcode一模一样了,所以只能添加一次。
这就要求我们自定义类型时,记得要重写Hashcode方法哦
hashset是利用hashmap实现的,所以我们主要会去看hashmap
hashmap有两个重要的成员变量,其中hashmap是双例集合,key是任意,value是object的
源码还是自己看吧,记笔记不方便,也不是很需要。
比如这个add方法,我们发现都是放入之前那个hashmap变量,并且Key是e,value是present,这意味着key才是用到的,value随便给一个即可
其他自己看吧,都是像这样自己观察的,对能力要求也不是很高。
treemap是Map接口的一个实现类,特点是支持对key进行排序。不过treemap重复元素依旧不允许出现。
下面是使用:
这里打印出来结果是a,b,c,侧面说明string类型中它已经实现了自身元素的排序规则了,字典序嘛。
string类实现了一个接口comparable,那么在这个comparable里面,就给了一个定义排序规则的抽象方法:
然后string里面实现了这个抽象方法(integer这种类也多半有排序规则):
然后在Treeset的排序中,就会调用这个方法。
这里主要说的是,如果是我们自己定义的类放到treeset中的情况
首先,如果我们定义的类没有排序规则,放进去后会报错:
出错了,类型转换异常
这里我们的user并没有实现自身的比较接口comparable,我们也没有给它一个外部比较器,所以treeset无法做排序处理。
那其中一个解决方法就是实现comparable,重写compareto,这里按年龄排序:
注意哦,这个大小谁大谁小是完完全全我们自己定义的,最后treeset都是按从“小”到“大”排序。
下面介绍使用比较器的方法:
首先我们写了一个student类
然后创建比较器类(实现了comparator接口)
这里的Object是默认的,可以改成student类型,然后里面写标记方法。
使用的时候就是通过构造方法把比较器传递给treeset:
如此即可。
也是了解即可,主要还是看treemap.
下图可以看到如何一步步从map往下的(间接实现map接口)
然后Treeset有两个成员变量:
present就是用来填补value的,navigablemap基本可以就看作map
然后我们可以看到一个无参,一个有参(比较器)的构造方法;
add也都一样