<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中的方法都可以用在規則集上