effective java学习笔记--4

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的
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值