现在的位置: 首页 > 综合 > 正文

HashSet泛型类

2019年11月14日 ⁄ 综合 ⁄ 共 3609字 ⁄ 字号 评论关闭

HashSet<E>泛型类在数据组织上类似于数学上的集合,可以进行“交”、“并”、“差”等运算。

1、HashSet<E>对象

HashSet<E>泛型类创建的对象称为集合,如:

<span style="font-family:Microsoft YaHei;font-size:14px;">HashSet<String> set = HashSet<String>; </span>

那么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()方法遍历集合。

 

 

<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;">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);
		}
	}
}
</span></span>

 

程序输出结果如下:
集合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。

 

<span style="font-family:Microsoft YaHei;font-size:14px;"><span style="font-family:Microsoft YaHei;font-size:14px;">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());
		}
	}
}
</span></span>

 

程序输出结果如下:

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>接口变量,那么接口就可以调用实现的接口方法。

 

 

 

 

 

 

抱歉!评论已关闭.