JAVA重写hashCode通用方法(摘录自《Effective Java》)

1. 初始化一个整形变量,为此变量赋予一个非零的常数值,比如int result = 17;
2. 选取equals方法中用于比较的所有域,然后针对每个域的属性进行计算:
(1) 如果是boolean值,则计算f ? 1:0
(2) 如果是byte\char\short\int,则计算(int)f
(3) 如果是long值,则计算(int)(f ^ (f >>> 32))
(4) 如果是float值,则计算Float.floatToIntBits(f)
(5) 如果是double值,则计算Double.doubleToLongBits(f),然后返回的结果是long,再用规则(3)去处理long,得到int
(6) 如果是对象应用,如果equals方法中采取递归调用的比较方式,那么hashCode中同样采取递归调用hashCode的方式。  否则需要为这个域计算一个范式,比如当这个域的值为null的时候,那么hashCode 值为0
(7) 如果是数组,那么需要为每个元素当做单独的域来处理。如果你使用的是1.5及以上版本的JDK,那么没必要自己去    重新遍历一遍数组,java.util.Arrays.hashCode方法包含了8种基本类型数组和引用数组的hashCode计算,算法同上,
  java.util.Arrays.hashCode(long[])的具体实现:

public static int hashCode(long a[]) {  
        if (a == null)  
            return 0;  
  
        int result = 1;  
        for (long element : a) {  
            int elementHash = (int)(element ^ (element >>> 32));  
            result = 31 * result + elementHash;  
        }  
  
        return result;  
}

example: 

package com.kingdee.cloudhub.stat.domains;

import java.util.Arrays;

public class Person {
	private int age;
	
	private String name;
	
	private char sex;
	
	private String[] hoby;

	public Person(int age, char sex, String name, String[] hoby) {
		this.age = age;
		this.sex = sex;
		this.name = name;
		this.hoby = hoby;
	}
	
	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;
	}

	public char getSex() {
		return sex;
	}

	public void setSex(char sex) {
		this.sex = sex;
	}

	public String[] getHoby() {
		return hoby;
	}

	public void setHoby(String[] hoby) {
		this.hoby = hoby;
	}

	public int hashCode() {
		int result = 1;
		result = 31 * result + age;
		result = 31 * result + sex;
		result = 31 * result + name.hashCode();
		for(String s : hoby) {
			result = 31 * result + s.hashCode();
		}
		return result;
	}

	public boolean equals(Object obj) {
		if(null == obj)
			return false;
		if(this == obj)
			return true;
		if (!(obj instanceof Person))
	           return false;
		Person p = (Person)obj;
		return this.age == p.age && this.sex == p.sex
				&& this.name.equals(p.name) && Arrays.equals(this.hoby, p.hoby);
	}

}

  

posted @ 2017-02-10 15:12  轻薄的假像  Views(427)  Comments(0)    收藏  举报