(一)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"));
}
}