Java中关系操做符“==”和equals()方法的区别

1、前言

若是问你Java中==和equals()有何区别,相信你的第一反应会回答:==比较的是它们所指向的对象地址,而equals()方法比较的是它们的内容值。实际上,这样的回答是不全面的。java

2、关系操做符“==”

摘自《Java编程思想》一书中的原话:编程

关系操做符“==”生成的是一个boolean结果,它们计算的是操做数的值之间的关系。this

 那么关于==的比较,无外乎如下两种状况。spa

  • 基本数据类型:它们的比较就是判断值是否相同。
  • 引用数据类型:它们的比较就是判断是不是同一个对象的引用,即其引用变量所指向的对象的地址是否相同。

、equals()方法

咱们知道,Java中全部的类都是由Object类派生出来的,在Object类中定义定义了equals()方法,其源码以下:.net

public boolean equals(Object obj) {
        return (this == obj);
    }

也就是说,在没有被重写的状况下,比较的是引用类型的变量所指向的对象的地址code

那么,有哪些经常使用的类equals()方法被重写了?好比String类、包装类、Date类都是。对象

String类equals()方法源码:blog

public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = value.length;
            if (n == anotherString.value.length) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

包装类,好比Integer中equals()方法源码:get

public boolean equals(Object obj) {
        if (obj instanceof Integer) {
            return value == ((Integer)obj).intValue();
        }
        return false;
    }

这些被重写的equals()方法的类,比较的是引用类型的变量所指向的对象存储的内容是否相等,即比较它们的值源码

推荐阅读 Java中包装类型的大小比较

相关文章
相关标签/搜索