package cn.stu;
public class Student {
public String userName;
public String schoolName;
@Override
public boolean equals(Object obj) {
if(obj != null && this != null){
Student stu = (Student)obj;
if(this.userName.equals(stu.userName) && this.schoolName.equals(stu.schoolName)){
return true;
}
return false;
}
return super.equals(obj);
}
@Override
public int hashCode() {
System.out.println("hashCode---->"+userName.hashCode() + schoolName.hashCode());
return userName.hashCode() + schoolName.hashCode();
}
}
package cn.stu;
import java.util.HashSet;
/**
*
* hashCode 只是一种有利于查找的一个表示记号,
*
* (1)当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true ,不然集合类就会出现问题。
(2)当obj1.hashCode() == obj2.hashCode()为false时,obj1.equals(obj2)必须为false,
规则比较的多, 感觉只要记住这两种就好。 用途一般都是和集合有关。
*
*/
public class Main {
public static void main(String[] args) {
Student stuA = new Student();
stuA.userName = "小强";
stuA.schoolName = "三年二班";
Student stuB = new Student();
stuB.userName = "小强";
stuB.schoolName = "三年二班";
// hashCode 相同, 但是对象地址不一样。 这样的话, 相同的val中, 存储了两个。 所以,一般重写了hashcode的时候也一定要
// 重写equals方法。
HashSet set = new HashSet();
set.add(stuA);
set.add(stuB);
set.add(stuA);
set.add(stuB);
System.out.println(set.size());
/*
* 只是从写hashcode的时候,运行结果如下
*
* hashCode---->754955619024812
hashCode---->754955619024812
hashCode---->754955619024812
hashCode---->754955619024812
2
*/
/*
* 重写equals方法, 保证对象是同一个对象。
*
hashCode---->754955619024812
hashCode---->754955619024812
hashCode---->754955619024812
hashCode---->754955619024812
1
*/
String a = "123";
String b = new String("123");
System.out.println(a == b);//------不同的对象,
System.out.println(a.equals(b));// ---------默认对String的equals方法进行了重写。但是还是不同的对象,只是val相同而已。
}
}