昆明java培训
达内昆明广州春城路

18487146383

热门课程

覆写equals方法时不要识别不出自己

  • 时间:2016-09-30
  • 发布:昆明Java培训
  • 来源:达内新闻

昆明Java培训机构的老师在写一个JavaBean时,经常会覆写equals方法,其目的是根据业务规则判断两个对象是否相等,比如我们写一个Person类,然后根据姓名判断两个实例对象是否相同时,这在DAO(Data Access Objects)层是经常用到的。具体操作时先从数据库中获得两个DTO(Data Transfer Object,数据传输对象),然后判断他们是否相等的,代码如下:

public class Person {

private String name;

public Person(String _name) {

name = _name;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

@Override

public boolean equals(Object obj) {

if(obj instanceof Person){

Person p = (Person) obj;

return ame.equalsIgnoreCase(p.getName().trim());

}

return false;

}

}

覆写的equals方法做了多个校验,考虑到Web上传递过来的对象有可能输入了前后空格,所以用trim方法剪切了一下,看看代码有没有问题,我们写一个main:

public static void main(String[] args) {

Person p1= new Person("张三");

Person p2= new Person("张三 ");

List<Person> list= new ArrayList<Person>();

list.add(p1);

list.add(p2);

System.out.println("列表中是否包含张三:"+list.contains(p1));   

System.out.println("列表中是否包含张三:"+list.contains(p2));

}

上面的代码产生了两个Person对象(注意p2变量中的那个张三后面有一个空格),然后放到list中,最后判断list是否包含了这两个对象。看上去没有问题,应该打印出两个true才对,但是结果却是:

列表中是否包含张三:true

列表中是否包含张三:false

刚刚放到list中的对象竟然说没有,这太让人失望了,原因何在呢?list类检查是否包含元素时时通过调用对象的equals方法来判断的,也就是说contains(p2)传递进去,会依次执行p2.equals(p1),p2.equals(p2),只有一个返回true,结果都是true,可惜的是比较结果都是false,那问题出来了:难道

p2.equals(p2)因为false不成?

还真说对了,p2.equals(p2)确实是false,看看我们的equals方法,它把第二个参数进行了剪切!也就是说比较的如下等式:

"张三 ".equalsIgnoreCase("张三");

注意前面的那个张三,是有空格的,那结果肯定是false了,错误也就此产生了,这是一个想做好事却办成了"坏事"的典型案例,它违背了equlas方法的自反性原则:对于任何非空引用x,x.equals(x)应该返回true,问题直到了,解决非常简单,只要把trim()去掉即可。注意解决的只是当前问题,该equals方法还存在其它问题。

了解详情请登陆昆明达内Java培训官网(km.Java.tedu.cn)!

上一篇:推荐使用序列化对象的拷贝
下一篇:equals应该考虑null值情景

昆明java培训机构:java未来的发展走向

昆明java培训机构:java学完可以干什么!

昆明java培训机构:如何搞定BAT和华为offer?有这份攻略就够了!

昆明java培训机构:学Java别担心枯燥和无聊

选择城市和中心
贵州省

广西省

海南省

扫一扫

了解更多干货