[编写高质量代码:改善java程序的151个建议]equals相关

因为会经常覆写equals方法,其目的是根据业务规则判断两个对象是否相等。

建议45:覆写equals方法时,不要识别不出自己

 
public boolean equals(Object obj){
    if(obj instanceof Person){
        Person p = (Person)obj;
        return name.equalsIgnoreCase(p.getName().trim());
    }
}
 
如果name本身含有空格,那样会导致不相等了。 违背了自反省

建议46:equals应该考虑null情况
对称性问题
上述name容易为null输入。
 
建议47:传递性
不要用instanceof来进行判断
要用getClass()进行判断,否则容易让子类绕过。
 
public boolean equals(Object obj){
    if(obj !=null && obj.getClass() == this.getClass() ){
        Person p = (Person)obj;
        if( p.getName() == null || name = null ){
            return false;
        }
        return name.equalsIgnoreCase(p.getName() );
    }
}
 
建议48:覆写equals方法必须覆写hashCode方法
为什么呢?
 
Map的底层机制
以数组的形式保存Map条目。其中的关键是下标的处理机制:
依据传入元素的hashCode方法的返回值决定其数组的下标。如果该数组上已经有了Map条目,且与传入的键值相等的话则不处理,若不相等则覆盖;如果数组位置上没有条目,则插入。并加入到Map条目的链表中。同理检查键是否存在也是根据哈戏码确定位置,然后遍查找键值的。
 
HashCodeBuilder
 
建议49:推荐覆写toString方法
apache commons工具包中的ToStringBuilder类。

转载于:https://www.cnblogs.com/akingseu/p/3485818.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值