J2EE基础集合框架之Set

前言:上次与大家介绍了集合框架的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,知识分享有缺漏的请大神多多指教。祝大家生活愉快!

   

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值