HashSet<E>泛型類在數據組織上類似於數學上的集合,可以進行“交”、“並”、“差”等運算。
1、HashSet<E>對象
HashSet<E>泛型類創建的對象稱爲集合,如:
HashSet<String> set = HashSet<String>;
那麼set就是一個可以存儲 string 類型數據的集合,set 可以調用 add(String s) 方法將 string 類型的數據添加到集合中。添加到集合中的數據稱爲集合的元素。集合不允許有相同的元素,也就是說,如果b已經是集合中的元素,那麼在執行 set.add(b)操作是無效的。集合對象的初始容量是16字節裝載因子是0.75。也就是說,如果集合添加的元素超過總容量的75%時,集合的容量將增加1倍。
2、常用方法
HashSet<E>泛型類的常用方法如下:
① public boolean add(E o) —— 向集合添加參數指定的元素。
② public void clear() ——清空集合,使集合不含有任何元素。
③ public boolean contains(Object o) —— 判斷參數指定的數據是否屬於集合。
④ public boolean isEmpty() —— 判斷集合是否爲空。
⑤ public boolean remove(Object o) ——集合刪除參數指定的元素。
⑥ public int size () —— 返回集合中元素的個數。
⑦ Object [ ] toArray() —— 將集合元素存放到數組中,並返回這個數組。
⑧ boolean containsAll (HashSet set) —— 判斷當前集合是否包含參數指定的集合。
⑨ public Object clone () —— 得到當前集合的一個克隆對象,該對象中元素的改變不會影響到當前集合中的元素,反之亦然。、
我們可以藉助泛型類Iterator<E>實現遍歷集合,一個集合對象可以使用iterator() 方法返回一個Iterator<E>類型的對象,如果集合是“Student類型”的集合,即集合中的元素是Student類創建的對象,那麼該集合使用iterator() 方法放回一個Iterator<Student>類型的對象,該對象使用next()方法遍歷集合。
package com.chindroid.date;
import java.util.HashSet;
import java.util.Iterator;
class Student{
String name;
int score;
Student(String name, int score){
this.name = name;
this.score = score;
}
}
public class TestHashSet {
public static void main(String[] args) {
Student zh = new Student("張紅銘",77);
Student wa = new Student("王家家",68);
Student li = new Student("李佳佳",67);
HashSet<Student> set = new HashSet<Student>();
HashSet<Student> subset = new HashSet<Student>();
set.add(zh);
set.add(wa);
set.add(li);
subset.add(wa);
subset.add(li);
if (set.contains(wa)){
System.out.println("集合set中含有:"+wa.name);
}
if(set.containsAll(subset)){
System.out.println("集合set包含集合subset");
}
int number = subset.size();
System.out.println("集合subset中有"+number+"個元素:");
Object s[] = subset.toArray();
for(int i=0; i<s.length; i++){
System.out.printf("姓名:%s,分數:%d\n", ((Student)s[i]).name,((Student)s[i]).score);
}
number = set.size();
System.out.println("集合set中有"+"個元素:");
Iterator<Student> iter = set.iterator();
while(iter.hasNext()){
Student te = iter.next();
System.out.printf("姓名:%s, 分數:%d\n", te.name,te.score);
}
}
}
程序輸出結果如下:
集合set中含有:王家家
集合set包含集合subset
集合subset中有2個元素:
姓名:王家家,分數:68
姓名:李佳佳,分數:67
集合set中有個元素:
姓名:王家家, 分數:68
姓名:張紅銘, 分數:77
姓名:李佳佳, 分數:67
3、集合的交、並與差
集合對象調用boolean addAll(HashSet set) 方法可以與參數指定的集合求並運算,使得當前集合成爲兩個集合的並。
集合對象調用boolean retainAll(HashSet set )方法可以與參數指定的集合求交運算,使得當前集合成爲兩個集合的交。
集合對象調用boolean removeAll (HashSet set ) 方法可以與參數指定的集合求差運算,使得當前集合成爲兩個集合的差。
參數指定的集合必須與當前集合是同種類型的集合,否則上述方法返回false。
package com.chindroid.date;
import java.util.HashSet;
import java.util.Iterator;
public class TestHashset2 {
public static void main(String[] args) {
Integer one = new Integer(1);
Integer two = new Integer(2);
Integer three = new Integer(3);
Integer four = new Integer(4);
Integer five = new Integer(5);
Integer six = new Integer(6);
HashSet<Integer> A = new HashSet<Integer>();
HashSet<Integer> B = new HashSet<Integer>();
HashSet<Integer> tempSet = new HashSet<Integer>();
A.add(one);
A.add(two);
A.add(three);
A.add(four);
B.add(one);
B.add(two);
B.add(five);
B.add(six);
tempSet = (HashSet<Integer>)A.clone();
A.removeAll(B);
B.removeAll(tempSet);
B.addAll(A);
int number = B.size();
System.out.println("A和B的對稱差集合有" + number + "個元素:");
Iterator<Integer> iter = B.iterator();
while (iter.hasNext()){
Integer te = iter.next();
System.out.printf("%d,",te.intValue());
}
}
}
程序輸出結果如下:
A和B的對稱差集合有4個元素:
3,4,5,6,
4、HashSet<E>泛型類實現的接口
HashSet<E>泛型類實現了泛型接口Set<E>,而Set<E>接口是Collection<E>接口的子接口。HashSet<E>類中的絕大部分方法都是接口方法的實現。編程時,可以使用接口回調技術,即把HashSet<E>對象的引用賦值給Collection<E>接口變量或Set<E>接口變量,那麼接口就可以調用實現的接口方法。