Java的equals()方法

经过几天的学习,终于对equals的用法有了比较全面的认识,并做一个总结。

1.equals的本意——即在Object对象中定义的equals()方法有什么样的意义。

(此处先附上==的作用,后面仍有叙述。因为==和equals()方法的关系是很密切的,后面有我自己的看法。

==用于比较引用和比较基本数据类型时具有不同的功能:
 比较基本数据类型,如果两个值相同,则结果为true
 而在比较引用时,如果引用指向内存中的同一对象,结果为true)

public boolean equals(Object obj)

其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.

public class Fish {
private int weight;
private String color;

public Fish(int weight, String color) {
    this.color = color;
    this.weight = weight;
}

public int getWeight() {
    return weight;
}

public void setWeight(int weight) {
    this.weight = weight;
}



public String getColor() {
    return color;
}

public void setColor(String color) {
    this.color = color;
}

}

public class EqualsTest {
public static void main(String[] args) {
Fish f1 = new Fish(1, "blue");
Fish f2 = new Fish(1, "blue");

    System.out.println(f1 == f2);
    System.out.println(f1.equals(f2));
}

}

——————运行结果为——————

false
false

由此可见,equals()方法的本意为确定两个对象的引用是否相同。

2.而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:
java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

public class EqualsTest {
public static void main(String[] args) {
String s1=new String("sss");
String s2=new String("sss");

    System.out.println(s1==s2);
    System.out.println(s1.equals(s2));
}

}

————————运行结果为——————

false
true

由此知道,在String中equals()方法被进行了覆盖,使其意义变为比较两个对象的内容是否一致

3.如果我们要自己覆盖equals()方法,让其比较内容或者有别的使用方法(当然我们一般都是用于比较内容的,但是覆盖的方法中真正的实现究竟是什么样的,谁知道呢O(∩_∩)O~)

public class Fish {
private int weight;
private String color;

public Fish(int weight, String color) {
    this.color = color;
    this.weight = weight;
}

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((color == null) ? 0 : color.hashCode());
    result = prime * result + weight;
    return result;
}

@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Fish other = (Fish) obj;
    if (color == null) {
        if (other.color != null)
            return false;
    } else if (!color.equals(other.color))
        return false;
    if (weight != other.weight)
        return false;
    return true;
}
public int getWeight() {
    return weight;
}

public void setWeight(int weight) {
    this.weight = weight;
}

public String getColor() {
    return color;
}

public void setColor(String color) {
    this.color = color;
}

}

public class EqualsTest {
public static void main(String[] args) {
Fish f1 = new Fish(1, "blue");
Fish f2 = new Fish(1, "blue");

    System.out.println(f1 == f2);
    System.out.println(f1.equals(f2));
}

}

——————运行结果为——————

false
true

此例子中我复写了equals()方法和hashcode()方法,使得equals()方法脱离的本意,不再是比较两个对象的引用是否相同,而是比较其内容是否相同。

以上内容为一般书上的总结,下面是我自己想到的一些东西。

我们可以知道计算机归根到底进行的只是一些二进制数的与或非运算,加法乘法运算。由此有了些基本的运算符,所有的函数本质上其实现都是使用基本运算符来实现的。而==是基本运算符中的一个,它的作用:用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true

而equals()作为方法,我们可以推测知道,它其中的实现所使用的肯定是==运算符。再进一步的思考,equals()本意不正是==运算符进行对象比较时候的作用吗。那么,既然是两者有同样的作用,为什么还要弄出一个equals()方法来呢。因为==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。在上面的第三个例子中,我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过==运算符是做不到的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,226评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,092评论 19 139
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,495评论 11 349
  • (一)Java部分 1、列举出JAVA中6个比较常用的包【天威诚信面试题】 【参考答案】 java.lang;ja...
    独云阅读 11,948评论 0 62
  • 第一财经周刊刚刚发一篇封面故事《这一轮单车大战,到底改变了什么?》,可说是共享单车发展的「浮世绘」。它综合了大量信...
    IT柚子阅读 1,760评论 0 0

友情链接更多精彩内容