集合之Set

Set集合就像是一个罐子,它记不住添加元素的顺序,所以Set集合不允许元素重复。即Set集合的特性是无序,不重复的

HashSet

HashSet是采用hash算法来存储元素的集合,所以查找与存取的速度都比较快。HashSet底层是通过HashMap实现的:

上面这段代码说了,HashSet中首先声明了一个HashMap类型的成员变量map,然后在构造函数中对其进行初始化,默认Capacity为16,loadFactor为0.75。
另外,关于HashSet的方法实现,其实都是调用HashMap的方法,只要把HashMap的原理搞明白了,这个就迎刃而解了~
这里我主要说一下HashSet添加元素的时候是怎么判断元素是否重复的(都知道HashSet不允许有重复值吧)!
当向一个HashSet中添加元素的时候,需要调用hashCode()方法得到被添加对象的hash code,然后根据该code值决定元素的存储位置。(如果两个对象通过equals方法比较得到true,但是hash code值不同,两个对象会被存放在不同的位置。
判断两个对象是否相等的依据是:hash code值相等且equals方法比较返回true
注:hashCode()方法是配合基于散列的集合(HashSet,HashMap,HashTable)一起运行的,在向散列集合中添加元素的时候,如果一一进行equals方法比较,一旦集合元素很多的情况下,运行效率必然下降,所以可以先计算hash code值,如果值相同,再进一步比较equals是否返回true,如果返回true说明元素已存在,不能添加,否则就可以添加。
对于equals比较返回false但hashcode值相等的情况,我们都知道,HashSet中每个元素存储的位置被成为“桶”,如果多个元素hash code值相等但equals方法返回false,就意味着要向同一个桶中添加多个元素,这样性能就肯定降低了,所以要重写equals方法和hashCode方法,确保hashcode相等时equals为true

TreeSet

上面说了,HashSet不能保证元素的顺序,可能会与元素的添加顺序不同(因为根据hash code值确定存储位置),但是TreeSet是一个排序的Set,确保元素处于排序状态。并且提供了求前一个、第一个、后一个、最后一个元素的方法。它判断元素是否重复可不是通过equals和hashCode方法了,而是通过compareTo()方法。所以要求添加进TreeSet的对象的类必须要实现Comparable接口。
注:compareTo比较返回一个整数,如果为0,表示对象相等,>0表示大于,<0表示小于

HashSet与TreeSet性能分析

HashSet的性能总体来说要比TreeSet好,因为TreeSet要花费额外的红黑树算法来维持元素的次序。所以如果不需要维护元素顺序,就选择HashSet吧。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值