Java面试题 equals()与"=="的区别?

面试官:请问 equals() 和 "==" 有什么区别?

应聘者:

  • equals()方法用来比较的是两个对象的内容是否相等,由于所有的类都是继承自java.lang.Object类的,所以适用于所有对象,如果没有对该方法进行覆盖的话,调用的仍然是Object类中的方法,而Object中的equals方法返回的却是==的判断;
  • "==" 比较的是变量(栈)内存中存放的对象的(堆)内存地址,用来判断两个对象的地址是否相同,即是否是指相同一个对象。

equals()作用

equals() 的作用是用来判断两个对象是否相等。

equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。源码如下:

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

既然Object.java中定义了equals()方法,这就意味着所有的Java类都实现了equals()方法,所有的类都可以通过equals()去比较两个对象是否相等。但是,我们已经说过,使用默认的“equals()”方法,等价于“==”方法。因此,我们通常会重写equals()方法:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。

下面根据"类是否覆盖equals()方法",将它分为2类。

  • 若某个类没有覆盖equals()方法,当它的通过equals()比较两个对象时,实际上是比较两个对象是不是同一个对象。这时,等价于通过“==”去比较这两个对象。
  • 我们可以覆盖类的equals()方法,来让equals()通过其它方式比较两个对象是否相等。通常的做法是:若两个对象的内容相等,则equals()方法返回true;否则,返回fasle。

下面,举例对上面的2种情况进行说明:

没有覆盖equals()方法的情况

public class EqualsTest {
    public static void main(String[] args) {
        // 新建2个相同内容的Person对象,
        // 再用equals比较它们是否相等
        User user1 = new User("James", 100);
        User user2 = new User("James", 100);
        System.out.printf("比较结果:" + user1.equals(user2));
    }

    /**
     * @desc User类。
     */
    static class User {
        int age;
        String name;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String toString() {
            return name + " - " + age;
        }
    }
}

运行结果:

比较结果:false

结果分析:我们通过 user1.equals(user2) 来“比较user1和user2是否相等时”。实际上,调用的Object.java的equals()方法,即调用的 (user1==user2) 。它是比较“p1和p2是否是同一个对象”。而由 user1 和 user2 的定义可知,它们虽然内容相同;但它们是两个不同的对象,因此,返回结果是false。

覆盖equals()方法的情况

修改上面的EqualsTest,覆盖equals()方法:

public class EqualsTest {
    public static void main(String[] args) {
        // 新建2个相同内容的Person对象,
        // 再用equals比较它们是否相等
        User user1 = new User("James", 100);
        User user2 = new User("James", 100);
        System.out.printf("比较结果:" + user1.equals(user2));
    }

    /**
     * @desc User类。
     */
    static class User {
        int age;
        String name;

        public User(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String toString() {
            return name + " - " + age;
        }

        @Override
        public boolean equals(Object obj) {
            if (this == obj)
                return true;
            if (obj == null)
                return false;
            if (getClass() != obj.getClass())
                return false;
            User other = (User) obj;
            if (age != other.age)
                return false;
            if (name == null) {
                if (other.name != null)
                    return false;
            } else if (!name.equals(other.name))
                return false;
            return true;
        }
    }
}

运行结果:

比较结果:true

结果分析:我们在EqualsTest.java 中重写了User的equals()函数:当两个User对象的 name 和 age 都相等,则返回true。因此,运行结果返回true。

== 的作用

“==”:它的作用是判断两个对象的地址是不是相等。即判断引用对象是不是指向的堆中的同一个对象,我们知道,凡是new出来的对象都在堆中。而对象的引用都存放在栈中,具体来讲就是放在栈帧中,我们来看下面一段代码:

public static void main(String[] args) {
        User user1 = new User("James", 100);
        User user2 = new User("James", 100);
        System.out.println("user1.equals(user2):" + user1.equals(user2));
        System.out.println("user1==user2:" + (user1==user2));
}

输出结果:

user1.equals(user2):true
user1==user2:false

用内存图表示如下:

指向的是堆中两块不同的区域,所以用 "==" 比较时返回的是false。

原文地址:https://www.cnblogs.com/marsitman/p/11181610.html

时间: 2024-10-10 04:12:30

Java面试题 equals()与"=="的区别?的相关文章

Java中“==”与equals方法的区别

1. 用“==”比较两个变量,如果两个变量是基本类型变量,且都是数值类,则值相等就返回true 如果两个变量是引用型变量,则两个对象的地址一样,即指向同一个对象,则返回true 2.equals:String类对equals进行了重写:1)若是同一个对象,返回true: 2)若不是,则比较它们的值,值相同,返回true 重写代码: public boolean equals(Object anObject) { if (this == anObject) { return true; } if

Java中的equals和==的区别

java中的数据类型,可分为两类: 1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false. JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个

J2SE快速进阶——Java中的equals和==的区别

我们都知道,Java中数据类型大体上可分为两类:基本数据类型和引用数据类型.equals和==都是用来比较数据与数据是否"相等". 基本数据类型的比较 基本数据类型之间的比较用"==",用来判断它们的值是否相等. 示例代码: public class Test{ public static void main(String[] args){ int i1=9; int i2=9; boolean b1=true; boolean b2=true; char c1='

Java学习之equals和==的区别

转自:http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html java中的数据类型,可分为两类: 1.基本数据类型  也称原始数据类型,byte,short,char,int,long,float,double,boolean,他们之间的比较,应用双等号(==),比较的是他们的值.      2.复合数据类型(类)     用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比

Java中的equals()与==的区别

1 根类object中的equals()与==没有区别: 如普通类Person中: Person per1 = new Person("张三",20): Person per2 = new Person("张三",20): System.out.print(per1.equals(per2));的结果为true. 2 String类改写了Object的equals(); ==是指对内存地址的值进行比较 equals()是对字符串的内容进行比较 如:String st

java中 == 和 equals()方法的区别

参考博客: 1.当要判断两个对象是否是相同时,可以重写equals()方法.....参考:   http://www.2cto.com/kf/201408/327873.html 2.具体 : http://www.cnblogs.com/zhxhdean/archive/2011/03/25/1995431.html 3.http://blog.csdn.net/xcysuccess3/article/details/6557771 主要注意的地方:String Integer等类的equal

浅谈java对象的equals方法

作为一个被问的很多的一个面试题:java中==和equals有什么区别? 网上普遍的回答都是:==比较的是内存地址,equals比较的是值. 其实这种回答是很不标准的,稍微标准一点的回答应该JDK自带的一些类对equals的实现各不同,例如 Object对象的equals的定义是这样的: public boolean equals(Object obj) { return (this == obj); } 所以在Object中==和equals是没有任何区别的. 但在String中,重写的equ

java中‘==’和‘equals()’方法的有趣探索

这两天在看周志明的<深入理解java虚拟机>,受益颇多,根据书中的启示,对java中'=='和'equals()'方法的区别做了一些探索. 首先,为了更快地让进入状态,我们先来所几个判断题,例程如下,请判断各个System.out.println()输出的结果. <pre name="code" class="java"> public static void main(String[] args) { Integer a =1; Integ

java String的equals,intern方法(转载)

JAVA中的equals和==的区别 ==比较的是2个对象的地址,而equals比较的是2个对象的内容. 显然,当equals为true时,==不一定为true: 基础知识的重要性,希望引起大家的重视,包括自己在内 很多困惑和疑问而且均来自于最基础的知识 折腾了一阵子又查了查书,终于对 String 这个特殊的对象有了点感悟 public class TestString { public static void main(String[] args) { String s1 = "Monday