HashSet存储自定义对象
1.首先会使用当前集合中的每一个元素和新添加的元素的hash值比较,
2.如果hash值不一样,则直接添加元素,如果hash值不一样,比较地址值或者使用equals方法进行比较,比较结果一样,则是认为是重复不添加
3.所有比较结果都不一样则添加
主要方法:重写hashcode和equals方法
代码演示:
package Set;
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args) {
HashSet<Student> set = new HashSet<Student>();
Student s1 = new Student("zhangsan", 20);
Student s2 = new Student("lisi", 23);
Student s3 = new Student("lisi", 23);
set.add(s1);
set.add(s2);
set.add(s3);
for (Student student : set) {
System.out.println(student);
}
}
}
class Student{
String name;
int age;
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
//自己写的
/*@Override
public int hashCode() {
return age+name.hashCode();
}
@Override
public boolean equals(Object obj) {
Student s = (Student)obj;
if(!(this.name.equals(s.name))) {
return false;
}
if(this.age!=s.age) {
return false;
}
return true;
}*/
//系统自动生成的
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Student other = (Student) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
}