java hash值

Java代码

public int hashCode() {
   int result = 17;  //任意素数
   result = 31*result +c1; //c1,c2是什么看下文解释
   result = 31*result +c2;
   return result;
  }
其中c1,c2是我们生成的你要计算在内的字段的代码,生成规则如下:

如果字段是boolean 计算为(f?1:0);

如果字段是byte,char,short,int则计算为 (int)f;

如果字段是long 计算为 (int)(f^(f>>32));

如果字段是float 计算为 Float.floatToLongBits(f);

如果字段是一个引用对象,那么直接调用对象的hashCode方法,如果需要判空,可以加上如果为空就返回0;


以下转自:http://dryr.blog.163.com/blog/static/58211013201081531458380/

以下列举了几点正确实现hashCode方法的指导方针。
1. 为整型变量hash设定任意一个非零的整数(比方说 7)。
2. 在计算对象的哈希码的时候,需要包含参与计算equals方法的变量。为每个变量var计算一个单独的哈希码var_code,应该遵循以下规则 -
a. 如果变量var是 byte,char,short或int类型,那么var_code = (int)var;
b. 如果变量var是long类型,那么var_code = (int)(var ^ (var >>> 32));
c. 如果变量var是float类型,那么var_code = Float.floatToIntBits(var);
d. 如果变量var是double类型,那么
long bits = Double.doubleToLongBits(var);
var_code = (int)(bits ^ (bits >>> 32));
e. 如果变量var是boolean,那么 var_code = var ? 1 : 0;
f. 如果变量var是引用类型,首先检查它是否为null,如果为null,var_code = 0; 否则执行引用类型的hashCode方法获取哈希码。简单实例代码如下:
var_code = (null == var ? 0 : var.hashCode());
3. 联合这些单独变量的哈希码var_code与原始哈希码变量hash做如下运算:
hash = 31 * hash + var_code;
4. 按照以上这些步骤计算对象中重要变量的哈希码值最后返回整型的计算结果hash
5. 最后,检查你的hashCode方法并确认相等对象是否会返回相同的哈希码值。并且验证同一次运行中在同一对象上多次调用多次调用hashCode方法返回的哈希码值是否相同。
这里所提出的方针仅作为指导,并不是绝对的准则。不过遵循这些方针来实现这两个方法的确会产生正确、一致的结果。

猜你喜欢

转载自lf6627926.iteye.com/blog/1915473