[编写高质量代码:改善java程序的151个建议]equals相关
2013-12-22 10:50
519 查看
因为会经常覆写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类。
建议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类。
相关文章推荐
- [编写高质量代码:改善java程序的151个建议]equals相关
- 读书笔记--编写高质量代码:改善java程序的151个建议(三)重写equals六大原则
- [编写高质量代码:改善java程序的151个建议]建议75 集合中元素必须做到compareTo和equals同步
- 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)
- [编写高质量代码:改善java程序的151个建议]建议31-在接口中不要存在实现代码
- [编写高质量代码:改善java程序的151个建议]建议59 对字符串排序(中文)
- [编写高质量代码:改善java程序的151个建议]建议77 使用Shuffle打乱列表
- [编写高质量代码:改善java程序的151个建议]建议123 volitile
- [编写高质量代码:改善java程序的151个建议]建议34:构造函数尽量简化
- [编写高质量代码:改善java程序的151个建议]建议67 不同的列表选择不同的遍历方法
- 读书笔记--编写高质量代码:改善java程序的151个建议(四)String,StringBuilder,StringBuffer
- 编写高质量代码:改善Java程序的151个建议 --[36~51]
- [编写高质量代码:改善java程序的151个建议]建议32-静态变量一定要先声明后赋值
- 编写高质量代码:改善Java程序的151个建议(第3章:类、对象及方法___建议36~40)
- [编写高质量代码:改善java程序的151个建议]建议62 警惕数组的浅拷贝
- [编写高质量代码:改善java程序的151个建议]建议78 减少HashMap中元素的数量
- [编写高质量代码:改善java程序的151个建议]建议127 Lock, synchronized
- 编写高质量代码:改善Java程序的151个建议
- 编写高质量代码:改善Java程序的151个建议