(一)Set接口的定义

      Set接口也是Collection接口的子接口,但是与Collection或List接口不同的是,Set接口中不能加入重复的元素。

      Set接口的定义: public interface Set<E> extends Collection<E>

      Set接口的主要方法与Collection是一致的 Set接口的实例无法像List接口那样进行双向输出。

      Set接口的常用子类:

      散列存放:HashSet

      有序存放:TreeSet

(二)介绍 Set接口的常用子类:

   2.1 散列的存放:HashSet

    HashSet是Set接口的一个子类,主要的特点是:里面不能存放重复元素,而且是采用散列的存储方式,所以是没有顺序的。 

        验证HashSet类

import java.util.HashSet;
import java.util.Set;
public class HashSetDemo01 {
	public static void main(String[] args) {
		Set<String> allSet = new HashSet<String>();
		allSet.add("A") ;				// 增加元素
		allSet.add("B") ;				// 增加元素
		allSet.add("C") ;				// 增加元素
		allSet.add("C") ;				// 重复元素,不能加入
		allSet.add("C") ;				// 重复元素,不能加入
		allSet.add("D") ;				// 增加元素
		allSet.add("E") ;				// 增加元素
		System.out.println(allSet) ;		// 输出集合对象,调用toString()
	}
}

2.2 有序的存放:TreeSet

        如果想对输入的数据进行有序排列,则要使用TreeSet子类。

        TreeSet类的定义如下:

        public class TreeSet<E> extends AbstractSet<E>implements SortedSet<E>, Cloneable, Serializable

import java.util.Set;
import java.util.TreeSet;
public class TreeSetDemo01 {
	public static void main(String[] args) {
		Set<String> allSet = new TreeSet<String>();
		allSet.add("C") ;				// 加入元素
		allSet.add("C") ;				// 重复元素,不能加入
		allSet.add("C") ;				// 重复元素,不能加入
		allSet.add("D") ;				// 加入元素
		allSet.add("B") ;				// 加入元素
		allSet.add("A") ;				// 加入元素
		allSet.add("E") ;				// 加入元素
		System.out.println(allSet) ;		// 输出集合,调用toString()
	}
}

2.2.1 关于TreeSet的排序说明 :

      一个普通的类对象是不能向TreeSet集合中加入的,如果直接加入会出现以下的异常: java.lang.ClassCastException

      如果要想使用TreeSet则对象所在的类必须实现Compable接口

import java.util.Set;
import java.util.TreeSet;
class Person implements Comparable<Person> {	// 定义Person类,实现比较器
	private String name;			// 定义name属性
	private int age;			// 定义age属性
	public Person(String name, int age) {	// 通过构造方法为属性赋值
		this.name = name;			// 为name属性赋值
		this.age = age;			// 为age属性赋值
	}
	public String toString() {		// 覆写toString()方法
		return "姓名:" + this.name + ";年龄:" + this.age;
	}
	public int compareTo(Person per) {		// 覆写compareTo()方法,指定排序规则
		if (this.age > per.age) {		// 通过年龄排序
			return 1;
		} else if (this.age < per.age) {
			return -1;
		}else{
			return 0 ;
		}
	}
}

2.2.2 关于重复元素的说明

     Set接口中是不允许存放重复元素的 一个类的对象是否重复需要依靠Object类中的以下方法完成:

      hashCode():指定哈希码

      equals():对象比较

import java.util.HashSet;
import java.util.Set;
class Person {					// 定义Person类
	private String name;					// 定义name属性
	private int age;					// 定义age属性
	public Person(String name, int age) {			// 通过构造方法为属性赋值
		this.name = name;				// 为name属性赋值
		this.age = age;				// 为age属性赋值
	}
	public boolean equals(Object obj) {			// 覆写equals()方法
		if (this == obj) { 				// 地址相等
			return true;				// 是同一个对象
		}
		if (!(obj instanceof Person)) { 			// 传递进来的不是本类的对象
			return false;				// 不是同一个对象
		}
		Person p = (Person) obj;				// 进行向下转型
		if (this.name.equals(p.name) && this.age == p.age) {
			return true ;				// 属性依次比较
		}else{					// 全部属性相等,是同一对象
			return false ;			// 属性不相等,不是同一对象
		}
	}
	public int hashCode(){				// 覆写hashCode()方法
		return this.name.hashCode() * this.age ;			// 指定编码公式
	}
	public String toString() {				// 覆写toString()方法
		return "姓名:" + this.name + ";年龄:" + this.age;
	}
}

2.3 SortedSet接口

       从TreeSet类的定义中可以发现,TreeSet里实现了SortedSet接口,此接口主要是用于排序操作的,即:实现此接口的子类都属于排序的子类。SortedSet接口定义如下: public interface SortedSet<E> extends Set<E>

2.3.1 SortedSet接口中定义的方法

No.

方法

类型

描述

1

public Comparator<? super E> comparator()

普通

返回与排序有关联的比较器

2

public E first()

普通

返回集合中的第一个元素

3

public SortedSet<E> headSet(E toElement)

普通

返回从开始到指定元素的集合

4

public E last()

普通

返回最后一个元素

5

public SortedSet<E> subSet(E fromElement,E toElement)

普通

返回指定对象间的元素

6

public SortedSet<E> tailSet(E fromElement)

普通

从指定元素到最后

验证SortedSet接口:

import java.util.SortedSet;
import java.util.TreeSet;
public class TreeSetDemo05 {
	public static void main(String[] args) {
		SortedSet<String> allSet = new TreeSet<String>(); 	// 为SortedSet实例化
		allSet.add("A");					// 增加元素
		allSet.add("B");					// 增加元素
		allSet.add("C");					// 增加元素
		allSet.add("C"); 					// 重复元素,不能加入
		allSet.add("C");					// 重复元素,不能加入
		allSet.add("D");					// 增加元素
		allSet.add("E");					// 增加元素
		System.out.println("第一个元素:" + allSet.first());
		System.out.println("最后一个元素:" + allSet.last());
		System.out.println("headSet元素:" + allSet.headSet("C"));
		System.out.println("tailSet元素:" + allSet.tailSet("C"));
		System.out.println("subSet元素:" + allSet.subSet("B","D"));
	}
}