set是如何区分重复数据的

本文详细介绍了Java中Set集合的工作原理,特别是HashSet如何通过hashCode和equals方法避免重复元素的添加,以及TreeSet如何通过实现Comparable接口对元素进行排序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

set不能存放重复数据,那么,set是如何区分两个数据是否重复呢?

public class Person{
private int id;
private String name;
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}



public class ListRemoveDu {
public static void main(String[] args) {
List<Person> list=new ArrayList();
Set<Person> set=new HashSet();
Person p1=new Person(1,"name1");
Person p2=new Person(2,"name2");
Person p3=new Person(3,"name3");
Person p4=new Person(2,"name2");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
for (Person p : list) {
set.add(p);
}
for (Person p : set) {
System.out.println(p.getName());
}
}
}

实际上两个重复的数据p2和p4都被添加进去了。
HashSet,这个集合类继承于Set接口,爷爷是Collection接口。首先他接受一个参数的泛型,泛型的作用就是在编译期去严格检查输入类型,HashSet添加元素时,需要对这个泛型类的hashCode值进行判断,测试是否为重复元素,如果一样,再测试equals结果。
所以以上的代码得改写成如下

public class Person{
private int id;
private String name;
public boolean equals(Object p){
if(((Person)p).getId()==this.getId()){
return true;
}else{
return false;
}
}
public int hashCode(){
return 0;
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}

这样就可以实现不添加重复数据了。
set的另一个实现是treeset,treeset是靠实现Comparator接口来对数据进行排序,所以不需要上面的equals方法了。
treeset的实现是

public class Person implements Comparable<Person>{
private int id;
private String name;
public int compareTo(Person person) {
if(this.getId()>person.getId()){
return -1;
}else if(this.getId()==person.getId()){
return 0;
}else{
return 1;
}
}
public Person(int id, String name) {
super();
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}


public class ListRemoveDu {
public static void main(String[] args) {
List<Person> list=new ArrayList();
Set<Person> set=new TreeSet();
Person p1=new Person(1,"name1");
Person p2=new Person(2,"name2");
Person p3=new Person(3,"name3");
Person p4=new Person(2,"name2");
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);
for (Person p : list) {
set.add(p);
}
for (Person p : set) {
System.out.println(p.getName());
}
}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值