8.3 方法实现的小建议
1. 把某个非0常数,比如17.保存在一个较results的变量中
2. 对于对象的每一个域做一下操作 计算散列码 c
2.1 boolean ---> c = f?0:1
2.2 byte char short int -- > (int)f;
2.3 long 类型 --> (int)(f^f >>> 32);
2.4 float 类型 -- > Float.floatToIntBits()转化为int
2.5 double 类型 -- > Double.doubleToLongBits() 转化为int
2.6 对象的引用,那么直接调用对象的hashCode()方法,具体在对象中自己实现。如果对象为null 那么就设置为0
2.7 数组,把数组中的每一个值作为单独的域来处理。递归的引用上面的规则。
3. 按照下面的公式来套用2中计算得到的 c
result = result*37 +c ; //选择37是因为37是一个素数
下列就是按照上面的规则进行的计算
@Override
public int hashCode()
{
int result = 17; //设置常量
result = result*37 + area; //转为int 计算
result = result*37 + exchange;
result = result*37 +extention;
return result; //返回自己需要的值
}
4.若是计算的hashCode非常复制,计算代价太大,那么可以将它放到系统缓存中。
private volatile static int hashCode = 0; //这样是作为一个缓存,并做lazy-initialized
@Override
public int hashCode()
{
if ( 0 == hashCode)
{
int result = 17;
result = result*37 + area;
result = result*37 + exchange;
result = result*37 + extention;
hashCode = result;
}
return hashCode;
}
第九条:总是要改写toString()
建议一定要改写该方法。
最好是指定一种格式来来覆盖该方法,可以的话提供一个公开静态的方法来解析toString后的方法。
第十条:谨慎的改写clone()方法
首先需要实现cloneanle接口,标示该类是允许clone的
1. 把某个非0常数,比如17.保存在一个较results的变量中
2. 对于对象的每一个域做一下操作 计算散列码 c
2.1 boolean ---> c = f?0:1
2.2 byte char short int -- > (int)f;
2.3 long 类型 --> (int)(f^f >>> 32);
2.4 float 类型 -- > Float.floatToIntBits()转化为int
2.5 double 类型 -- > Double.doubleToLongBits() 转化为int
2.6 对象的引用,那么直接调用对象的hashCode()方法,具体在对象中自己实现。如果对象为null 那么就设置为0
2.7 数组,把数组中的每一个值作为单独的域来处理。递归的引用上面的规则。
3. 按照下面的公式来套用2中计算得到的 c
result = result*37 +c ; //选择37是因为37是一个素数
下列就是按照上面的规则进行的计算
@Override
public int hashCode()
{
int result = 17; //设置常量
result = result*37 + area; //转为int 计算
result = result*37 + exchange;
result = result*37 +extention;
return result; //返回自己需要的值
}
4.若是计算的hashCode非常复制,计算代价太大,那么可以将它放到系统缓存中。
private volatile static int hashCode = 0; //这样是作为一个缓存,并做lazy-initialized
@Override
public int hashCode()
{
if ( 0 == hashCode)
{
int result = 17;
result = result*37 + area;
result = result*37 + exchange;
result = result*37 + extention;
hashCode = result;
}
return hashCode;
}
第九条:总是要改写toString()
建议一定要改写该方法。
最好是指定一种格式来来覆盖该方法,可以的话提供一个公开静态的方法来解析toString后的方法。
第十条:谨慎的改写clone()方法
首先需要实现cloneanle接口,标示该类是允许clone的