前面我已经提到了List 是一个有序集合,可以允许重复,而今天要研究的Set 是无序集合,不允许重复;
Set 分别被HashSet、TreeSet、LinkHashSet继承。
本文以HashSet 举例 介绍Set的用法
不可重复测试
Set<String> s=new HashSet<>();
s.add("a");
s.add("b");
s.add("c");
s.add("c");
System.out.println(s.size());
输入结果:
3
输入结果是3
Set<String> s=new HashSet<String>();
s.add("a1");
s.add("b2");
s.add("c3");
s.add("c3");
for (String t:s
) {
System.out.println(t);
}
结果:
a1
b2
c3
以上测试足见了Set是不重复的,集合是支持以为类为集合对像的,那么就试一下类
类
class Stu{
private String name;
private int age;
public Stu(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Stu{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
存储代码
Set<Stu> stus=new HashSet<>();
stus.add(new Stu("张三",11));
stus.add(new Stu("李四",12));
stus.add(new Stu("王五",14));
stus.add(new Stu("赵六",16));//测试重复对象
stus.add(new Stu("赵六",16));//重复者
System.out.println(stus.size());
运行结果
5
为啥呢?
因为存储的对象,存储对象存储是无法去除的,想要去重只能修改存储对象类的equals方法与hashCode方法如下:
class Stu{
private String name;
private int age;
public Stu(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Stu{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Stu stu = (Stu) o;
return age == stu.age &&
name.equals(stu.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
再运行测试
4
结果如期
TreeSet 可以根据规则进行排重。当存储类的时候需要类继承Comparator接口
如下:
class Stu implements Comparator<Stu> {
private String name;
private int age;
public Stu() {
}
public Stu(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public int compare(Stu stu, Stu t1) {
return stu.getAge()-t1.getAge();
}
@Override
public String toString() {
return "Stu{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Stu stu = (Stu) o;
return age == stu.age &&
name.equals(stu.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
}
调用
TreeSet<Stu> tr=new TreeSet<Stu>(new Stu());
tr.add(new Stu("张三",11));
tr.add(new Stu("李四",12));
tr.add(new Stu("王五",14));
tr.add(new Stu("赵六",16));//测试重复对象
tr.add(new Stu("赵六",16));//重复者
System.out.println(tr.size());
结果理想
LinkHashSet 与HashSet 不同之处在于它可以定义顺利(以链表的方面存储所以有顺利)