HashSet是Set接口的一个实现类,储存特点是无序不重复
储存原理如下:
可以看出,储存元素时,要用HashSet方法 和equals方法,这就是为什么该类的元素特点是无序不重复。
看下面一个例子:
import java.util.*;
class Student{
private int number;
private String name;
// 构造方法
public Student() {
}
public Student(int number,String name) {
this.number=number;
this.name=name;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return number+":"+name;
}
}
public class test3 {
public static void main(String[] args) {
HashSet hs=new HashSet();
Student stu1=new Student(2,"Rose");
Student stu2=new Student(1,"Jack");
Student stu3=new Student(2,"Rose");
hs.add(stu1);
hs.add(stu2);
hs.add(stu3);
System.out.println(hs.toString());
}
}
运行结果:
不难发现,如果要保证HashSet正常工作,那么在存入对象时,我们就要重写Object类中的HashCode()方法和equals()方法,但是,对于String对象来说,java就已经重写了HashCode()方法和equals()方法。要重写,那我们先了解一下Object中的equals()方法,理解了其中的原理,我们就能更好的重写我们需要的方法
Object类中的equals()方法
那么接下来,就是对于上面代码的改进:
import java.util.*;
class Student{
private int number;
private String name;
// 构造方法
public Student() {
}
public Student(int number,String name) {
this.number=number;
this.name=name;
}
// 重写toString方法
public String toString() {
return number+":"+name;
}
// 重写hashCode和equals方法
public int hashCode() {
return name.hashCode();
}
public boolean equals(Object obj) {
if(this==obj) { //比较s1和s2地址是不相同,相同为true
return true;
}
if(!(obj instanceof Student)) { //比较是不是obj是不是Student的实例,不是的返回false
return false;
}
Student stu=(Student) obj; //类型强制转换
boolean b=this.name.equals(stu.name); //调用equals进行比较
return b;
}
public int getNumber() {
return number;
}
public void setNumber(int number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
public class test4 {
public static void main(String[] args) {
HashSet hs=new HashSet();
Student stu1=new Student(2,"Rose");
Student stu2=new Student(1,"Jack");
Student stu3=new Student(2,"Rose");
hs.add(stu1);
hs.add(stu2);
hs.add(stu3);
System.out.println(hs.toString());
}
}
运行结果: