<span style="font-family: Arial, Helvetica, sans-serif; background-color: rgb(255, 255, 255);">Set接口扩展了Collection接口,只是规定Set的实例不包含重复的元素(这个可以好好利用一下,做某些事情很方便)</span>
由于它会判断添加的元素是否存在于集合中,用到equals方法,而是否相同取决于我们对具体类的定义,比如一个类,人,假如只要名字相同就是同一个人的话,我们就需要重写equals方法,而一般重写equals就需要重写hashCode方法,为了维持协定:
如果x.equals(y)返回“true”,那么x和y的hashCode()必须相等。
如果x.equals(y)返回“false”,那么x和y的hashCode()有可能相等,也有可能不等
规则集Set
1.散列集HashSet
可以用它的无参构造方法创建空的散列集,也可以由一个现有的集合创建散列集
注意,它的构造方法中可以指定初始容量与客座率,一般默认初始容量为16,客座率为0.75,也就是说默认可以存储的元素个数为16*0.75=12个,当元素个数打到12个时,容量就会翻倍,也就是32。
对于客座率,较高的客座率会降低空间开销(容量未发生变化前能存更多的元素),但是会增加查找时间,0.75只是时间开销和空间开销上一个很好的权衡点。
散列集中的元素是没有特定的顺序的,如果要加上一个顺序,可以使用LinkedHashSet
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class MyDemo {
public static void main(String[] args){
Set<String> set=new HashSet<String>();
set.add("a");
set.add("b");
set.add("c");
set.add("d");
System.out.println(set);//注意直接输出set的形式
<span style="white-space:pre"> </span>Iterator<String> iterator=set.iterator();
while(iterator.hasNext()){
System.out.print(iterator.next()+" ");
}
}
}
输出结果:
[a, b, c, d]
a b c d
特别注意以下这个结果,我们知道HashSet中的元素是没有特定顺序的,也就是不一定按你插入的顺序输出。但是上面的输出结果却是按照插入的顺序输出的,无论运行多少遍都是同样的结果。
这个要说一下无序不代表随机,元素在集合中的位置是由它的哈希码决定的,Integer类中的hashCode方法返回它的int值,String类的hashCode方法中有一个哈希码计算式子,也就是说每个固定的字符串拥有自己固定的哈希码,当几个特定的字符串添加到一个集合中,无论添加的顺序是怎样的,只要这几个特定的字符串不变,输出结果是一定的,比如上面的代码中,如果更改a,b,c,d的插入顺序 ,输出结果不会发生变化,还是a b c d
再举个极端例子,如果你自定义一个类,并且重写了equals方法和hashCode方法,而且hashCode方法返回某个固定值,
那么当你将几个这个自定义类的对象插入HashSet时,输出跟插入顺序一样。
<pre name="code" class="java">import java.util.HashSet;
import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;
public class MyDemo {
public static void main(String[] args) {
Set<MyInteger> set = new HashSet();
set.add(new MyInteger(1));
set.add(new MyInteger(4));
set.add(new MyInteger(3));
set.add(new MyInteger(2));
System.out.println(set);
Iterator<MyInteger> iterator = set.iterator();
while (iterator.hasNext()) {
System.out.print(iterator.next() + " ");
}
}
}
class MyInteger {
private Integer mInt;
public MyInteger(int i) {
mInt = i;
}
public int hashCode() {
return 1;
}
public int value() {
return mInt;
}
public boolean equals(Object obj) {
if (!(obj instanceof MyInteger))
return false;
return mInt.equals(((MyInteger) obj).value());
}
public String toString() {
return mInt.toString();
}
}
输出结果:
[1,4,3,2]
1 4 3 2
Set 是Collection的一个实例,所以定义在Collection中的方法都可以用在规则集上