题目:定义人类,包含姓名和年龄属性。创建4个人存储到HashSet中,姓名和年龄相同的人看做同一人不存储。
#people.java
package com.sgu.test6;
public class People {
private String name;
private String age;
public People() {
}
public People(String name, String age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
}
#HashSetTest.java
package com.sgu.test6;
import java.util.HashSet;
public class HashSetTest {
public static void main(String[] args) {
HashSet<People> hs = new HashSet<>();
People p1 = new People("zhangsan", "21");
People p2 = new People("lisi", "22");
People p3 = new People("zhangsan", "21");
People p4 = new People("lisi", "22");
hs.add(p1);
hs.add(p2);
hs.add(p3);
hs.add(p4);
System.out.println("共有" + hs.size() + "个人");
}
}
问题:
上面的代码运行出来的结果如图,把相同的对象一起添加进去了。可是HashSet 不是基于 HashMap 来实现的,是一个不允许有重复元素的集合吗?
我找了菜鸟教程,案例也显示结果是不会添加重复元素的,如下图:
原因:
这是因为HashSet存储的对象是我们自定义的People,想要重复对象不插入,需要重写hashCode和equals方法。
那为什么菜鸟教程里面的实例不用呢?
这是因为String和Integer类型是Java提供的,已经写好了,所以不需要重写hashCode()和equals()也可以不增加重复数据。
我们在idea中Ctrl+N,搜索String类并打开,
(记得是java.lang包下面的,没有的话把搜索条件改为All Places)
可以看到:
可以看到String类在Java中已经写好了hashCode()和equals()。
解决:
1、在people.java文件中添加上下面的代码:
@Override
public int hashCode() {
return name.hashCode()+age.hashCode();
}
@Override
public boolean equals(Object obj) {
if(this == obj){
return true;
} else if(obj instanceof People){
People p = (People) obj;
if(name.equals(p.getName()) && age.equals(p.getAge())){
return true;
} else{
return false;
}
} else{
return false;
}
}
2、或者,在People.java中,按Alt+Insert,选择equals() and hashCode(),idea自动添加
解决!