Home >Java >javaTutorial >equals和hashcode
Summary of equals and hashcode:
If the equals method is not overridden, it is used to determine the memory address reference of the object. Whether to use an address. After rewriting, it is generally used to compare whether the contents of the objects are equal (for example, the student object contains name and age. We rewrite the equals method to judge that as long as the name and age are the same, it is considered to be a student).
HashCode is an int type value calculated by jdk based on the object's address or string or number. Of course, you can also rewrite it. The hashcode method is only used in collections.
When an object is put into a set, first determine whether the hashcode is equal, and then determine whether equals are equal. If they are all equal, it is the same object. List can be put in, but set does not allow duplication because it does not allow duplication. put into a.
For example:
public class Student { private int age; private String name; public Student(int age ,String name){ this.age = age; this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } //重写equals方法,判断姓名和年龄相同就是相等的 public boolean equals(Object o){ if(o == null){ return false; } if(this.getClass() != o.getClass()){ return false; } Student student = (Student)o; if(name == null){ return false; } if(age==student.getAge()&&name.equals(student.getName())){ return true; } return false; } public static void main(String[] args) { Student studentOne = new Student(1,"yjc"); Student studentTwo = new Student(1,new String("yjc")); System.out.println(studentOne.equals(studentTwo)); System.out.println("1: "+studentOne.getName().hashCode()); System.out.println("2: "+studentTwo.getName().hashCode()); } //输出结果:true 1: 119666 2: 119666 }
As can be seen from the above, both Strings are called "yjc", whether it is directly "yjc" or new String ("yjc"), their hashcode All the same. So you can use this when overriding the hashcode method.
For example, if you want that if the name and age are the same, not only the equals but also their hashcodes must be the same. You can rewrite the hashcode like this:
public int hashcode(){ final int prime = 31; int result = 1; result = prime*result + age; result = prime*result + (name == null? 0 : name.hashcode()); return result;//直接写age+(name == null? 0 : name.hashcode())也行就是感觉太简单了0.0 }
In this way, there will be two Students with the same name and age. The object is the same object and will be considered the same when placed in the set. No matter how many such objects are placed, set.size() will always be equal to 1.
Similarly, the HashMap key is also unique. The HashMap object locates the storage location according to the hashCode of its Key, and uses equals(key) to obtain the corresponding Value, so it is judged whether the key has reused the hashcode during put. and equals will be overwritten if repeated.
The above is the detailed content of equals和hashcode. For more information, please follow other related articles on the PHP Chinese website!