一、Set 接口的定义
Set 接口也是 Collection 接口的子接口,但是与 Collection 或者 List 接口不同,Set接口不能加入重复的元素。
public interface Set<E> extends Collection<E>
Set 接口主要方法与 Collection 接口一致,并没有对其进行扩充,只是比 Collection 接口的要求更加严格,不能增加重复的元素
Set 接口的实例无法像 List 接口进行双向输出,因为此接口没有提供像 List 接口定义的 get(int index)
方法
二、Set 接口的常用子类
1. 散列的存放:HashSet
HashSet 是 Set 接口的一个子类,主要特点是:里面不能存放重复元素,而且采用散列的存储方式,所以没有顺序
import java.util.HashSet;
import java.util.Set;
public class Test{
public static void main(String[] args) {
Set<String> allSet = new HashSet<String >();
allSet.add("A");
allSet.add("B");
allSet.add("B");//重复元素,不能加入
allSet.add("C");
System.out.println(allSet);//输出集合对象,调用 toString()
}
}
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
结果可以看出,对于重复元素只会增加一次,而且程序运行时向集合中加入元素的顺序并不是集合中的保存顺序,HashSet 类中的元素时无序排列的
2. 有序的存放:TreeSet
如果想对输入的数据有序排列,需要使用 TreeSet 子类。TreeSet 类的定义:
public class TreeSet<E> extends AbstractSet<E> implements SortedSet<E>,
Cloneable,Seriallizable
- 2
TreeSet 类也是继承了 AbstractSet 类,此类的定义如下:
public abstract class AbstractSet<E> extends AbstractCollection<E>
implements Set<E>
- 2
import java.util.Set;
import java.util.TreeSet;
public class Test{
public static void main(String[] args) {
Set<String> allSet = new TreeSet<String >();
allSet.add("D");
allSet.add("B");
allSet.add("B");//重复元素,不能加入
allSet.add("C");
allSet.add("D");//重复元素,不能加入
allSet.add("A");
System.out.println(allSet);//输出集合对象,调用 toString()
}
}
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
向集合中插入数据时是没有顺序的,但是输出之后数据是有序的,所以 TreeSet 是可以排序的子类。
3. 自定义类排序
通过覆写 equals()
方法和 hashCode()
方法去掉集合中的重复
import java.util.HashSet;
import java.util.Set;
class Person{
private String name;
private int age;
public Person(String name,int age){
this.name = name;
this.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;
}
}
public class Test{
public static void main(String[] args) {
Set<Person> allSet = new HashSet<Person>();//实例化 Set 接口对象
allSet.add(new Person("张三",30));//加入元素
allSet.add(new Person("李四",31));//加入元素
allSet.add(new Person("王五",32));//加入元素
allSet.add(new Person("王五",32));//重复元素,不能加入元素
allSet.add(new Person("赵六",33));
allSet.add(new Person("孙七",33));//年龄重复
System.out.println(allSet);
}
}
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43