前言:上次与大家介绍了集合框架的LIst集合,List集合的特点的是元素有序且可重复,今天与大家分享的是也是一种集合,叫做Set集合,他和List集合是相反的,今天我们就一起去探究Set集合。首先跟思维导图来了解我今天要分享的内容吧。(说明:运行代码在左边,运行代码展现出的运行效果在右边。)
今天主要与大家分享四个点,第一个就是set集合的特点,2、遍历set集合的几种方式,3、hashset去重复底层研究,4、treeset的自然排序和比较器排序。
一、Set集合的特点
1、不重复性:
当加入两次元素b时,最后打印set集合也只显示元素b一次,这里体现set集合不重复性。
2、无序性:
第一次运行效果在上面,接下来请看第二次:
第二次还是按照abc排的顺序,为了证明Set集合的无序性接下来请看第三次运行效果:
由上述证明,我们可以看到Set集合不是真正意义上的“无序",而是由内部一些定好的规则去进行排序变成”无序“。
二、Set集合的遍历方式
由于set集合和list集合不一样,list集合有下标可以用for循环开始遍历,而set集合没有下标,所以用foreach遍历和迭代器遍历。
1、foreach遍历set集合
2、迭代器遍历set集合
三、HashSet哈希表存储,重复元素存储底层探究
原理:HashSet底层数据结构是哈希表,优先会调用HashSet方法,对比地址,然后调用equals方法对比值。
1、当hashcode方法返回的是一个结果集(result)时,hashcode方法就会跟随对象有几个就会出现几次。(如下图所示)
也可以用图来解释。如下图所示:有几个对象就会显示多少次hashcode方法,当代吗运行到相同对象时就会调用equals方法。对象相同是时会使用同一地址。
2、当hashcode方法返回的是0时,hashcode在第一次出现没遇到重复元素的次数。hashset方法调用次数递减,而equals方法的次数增多。(如下图所示)
大家可以看到我的对象只有四个,由于hashset返回的都是0,第一个对象也是0第二个对象也是0,所以hashcode出现两次,进而有了两个对象,可以进行对比了,所以调用equals方法,再然后运行到第三个对象,第三个对象返回的hashcode值是0,所以只调用一次hashcode,然而要与前两个对象进行比较,进而equals会调用两次。以此类推。(之后hashcode方法调用一次就是因为hashcode返回值都是0)
四、Treeset的自然排序和比较器排序
1、两种排序的特点:
自然排序:其中的规则是不灵活的。
比较器排序:规则是灵活可变的。(要实现compator)
2、自然排序:
可以发现自然排序中的规则自己要去手打代码,才能实现排序功能,上图是按照升序的顺序进行排序。(下图按照升序的顺序进行排序的代码)
public int compareTo(Object o) {
User u = (User) o;
return this.money - u.money;
}
降序就是将两个属性反过来。
public int compareTo(Object o) {
User u = (User) o;
return u.money - this.money;
}
(上图按照降序的顺序进行排序的代码)
3、比较器排序:
比较器排序和自然排序的最大不同就是规则问题了。而出现的效果就是和自然排序的效果一样,但是在现在的项目中用比较器排序会比较好,规则灵活可变。
总结:今天与大家分享的知识就到这里了,下一次与大家分享J2EE基础集合框架之Map,知识分享有缺漏的请大神多多指教。祝大家生活愉快!