equals 方法里面的“坑”


layout: post
title: equals 方法里面的“坑”
tags:

  • Java
  • 基础知识
    categories: Java

今天遇到一个比较细节的bug,稍微有点基础的都知道 == 和 equals 的用法,前者用于比较基本数据类型值是否相等,当用于引用类型的时候,一般比较的都是引用地址,因此我们在比较两个对象是否相等时就用后者。然而。。。

先来看一段代码:

Integer n1 = new Integer(21);
Integer n2 = new Integer(21);
System.out.println(n1 == n2);
System.out.println(n1.equals(n2));

不难知道。前者比较的引用,返回false,后者比较的内容,返回true;

下面,我们自定义一个Student类:

class Student {
    private String name;
    private int age;
    
    public Student(String name,int age) {
        this.name = name;
        this.age = age;
    }
}

省略掉了setter和getter,然后我们再来new两个对象比较一下:

Student s1 = new Student("Big",21);
Student s2 = new Student("Big",21);
System.out.println(s1 == s2);
System.out.println(s1.equals(s2));

你能猜到打印的结果吗?两个都是false!这就很费解了,为什么equals不好使了呢?这是因为:

因为equals()方法默认行为是比较引用,因此在新类中要自己重写equals()方法,否则不可能表现出我们希望的行为。 ——《Thinking in Java》3.7.1

OK,到这里我们就发现了原因了,我们在Student类中添加一个equals方法:

    public boolean equals(Student s) {
        if (s != null && this.name.equals(s.name) && this.age == s.age)
            return true;
        return false;
    }

至此,问题解决,s1.equals(s2) 会返回我们期望的结果。虽然,问题很小,但是不了解equals方法的默认行为的话,这个bug还是很难发现的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,805评论 18 399
  • 个人博客: 斯科特安的时间 今天看资料时看到coolshell的这篇文章,获益匪浅,收藏到文库里。 译文原文:ht...
    斯科特安阅读 5,257评论 4 23
  • 面向对象主要针对面向过程。 面向过程的基本单元是函数。 什么是对象:EVERYTHING IS OBJECT(万物...
    sinpi阅读 1,103评论 0 4
  • 一、出租车及打车应用行业历史背景 出租车行业最早出现的时候,由于车辆较少,经营基本上以电话预定或登门预约为主,人们...
    原军锋阅读 2,396评论 0 14
  • 从上海回樟树的这些天,一直是在浑浑噩噩的吃睡中度过的,家里只有母亲,弟弟,和我三人,父亲在离樟树一百公里外的吉水上...
    阿瞳丫丫阅读 490评论 1 4