课程咨询 :186 8716 1620      qq:2066486918

昆明Java培训 > 达内新闻 > 覆写equals方法时不要识别不出自己
  • 覆写equals方法时不要识别不出自己

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

  • 昆明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--零基础全日制班

开班日期:11/30

Java--零基础业余班

Java--零基础业余班

开班日期:11/30

Java--周末提升班

Java--周末提升班

开班日期:11/30

Java--零基础周末班

Java--零基础周末班

开班日期:11/30

  • 网址:http://km .java.tedu.cn      地址:昆明市官渡区春城路62号证券大厦附楼6楼
  • 课程培训电话:186 8716 1620      qq:2066486918    全国服务监督电话:400-827-0010
  • 服务邮箱 ts@tedu.cn
  • 2001-2016 达内国际公司(TARENA INTERNATIONAL,INC.) 版权所有 京ICP证08000853号-56