当前位置:编程学习 > JAVA >>

重写equals方法时,记住,也要重写hashCode方法(当你使用集合HashMap,HashSet,Hashtable)

看例子吧
[java]  
package equalhashcode;  
  
import java.util.*;  
  
import bad.NewFileSize;  
  
class Person {  
    private String username;  
      
    private int age;  
  
    public Person() {  
          
    }  
      
    public Person(String username,int age) {  
        this.username = username;  
        this.age = age;  
    }  
      
    public String getUsername() {  
        return username;  
    }  
  
    public void setUsername(String username) {  
        this.username = username;  
    }  
  
    public int getAge() {  
        return age;  
    }  
  
    public void setAge(int age) {  
        this.age = age;  
    }  
  
    @Override  
    public boolean equals(Object obj) {  
        Person person = (Person)obj;  
        boolean flag = false;  
        if(this.username.equals(person.getUsername())&&this.age==person.getAge()) {  
            flag = true;  
        }  
        return flag;  
    }  
      
}  
  
public class EqualDemo {  
    public static void main(String[] args) {  
        Map map = new HashMap<>();  
        map.put(new Person("tree",25), "hello");  
        System.out.println(map.get(new Person("tree",25)));  
    }  
  
}  
 
返回结果是null,获取不到内容
而当我们重写了hashCode方法呢
[java]  
@Override  
    public int hashCode() {  
        // TODO Auto-generated method stub  
        return age*2;  
    }  
 
返回的结果就是hello了。
 
因为hashCOde有通用约定:
1、只要对象的equals方法所比较的信息没有修改,那么对这同一个对象调用多次,hashCode都必须始终如一的返回同一个整数。
2、如果两个对象equals比较相等,那么hashCode必须相等。
3、如果equals比较不相等,那么hashCode必须不相等。
 
至于hashCode怎么重写,首先你肯定要清楚equals方法所用到的字段,然后将这些字段完成到散列码的转换,至于如何操作,就看你自己如何定义了。
比如boolean,true->1,false->0等等
 
补充:软件开发 , Java ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,