java基础002-java中的`==`与`equals`详解


在实际编程中,常常会须要比较两个值或两个对象是否相等(相同),这时咱们一般会使用==equals。那么它们各自表明着什么含义,又有什么区别呢?今天来总结一下。html


关系操做符==

有两种状况:数据是基本类型,或引用类型(即对象)java

  1. 对于基本数据类型(八种),==比较的是值
  2. 对于引用类型,==比较的是所引用的对象是不是同一个,即指向的内存地址是否相同

下面看测试代码:python

private static void main(String[] args) {
        int a1 = 10;
        int a2 = 10;
        System.out.println(a1 == a2);

        double d1 = 6.7;
        double d2 = 6.7;
        System.out.println(d1 == d2);

        boolean b1 = true;
        boolean b2 = true;
        System.out.println(b1 == b2);

        char c1 = 'x';
        char c2 = 'x';
        System.out.println(c1 == c2);
    }
复制代码

测试结果:编程

true
true
true
true
复制代码

equals方法

首先咱们要理解,这个equals方法是咱们要比较的对象所属的类从超类Object一层一层继承过来的。那么咱们先看一下Object类中的源码:bash

public class Object {
    public boolean equals(Object obj) {
        return (this == obj);
    }
}
复制代码

哦,原来Object类的这个equals方法用的是==啊。那为何String对象的equals方法竟然能比较两个不一样的对象相等呢?咱们看下String类的源码:测试

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;
    }
复制代码

这样一看就明白了,String类重写了Object类的equals方法,使用equals比较String对象变成了比较每个字符的值,因此相同的String对象才会相等this

所以,在使用equals比较引用类型时,若是这个对象所属的类重写了equals方法,就按照这个规则来断定。若是没有重写,那么就按照Object类的equals方法判断——也就是与==号相同了。spa

注:基本数据类型与引用类型不一样,它不属于任何类,也就没有equals方法了。code

下面看测试代码:htm

package com.eknown.basic;

/** * @author zfh * @version 1.0 * @since 2019/5/16 9:28 */
public class EqualsTest {

    public static void main(String[] args) {

        // 测试重写了equals方法的String类对象
        System.out.println("测试重写了equals方法的String类对象");
        String str1 = new String("abc"); // 注意:String str = "abc"和 str = new String("abc")是不一样的。
        String str2 = new String("abc");
        String str3 = new String("gcc");

        System.out.println(str1.equals(str2));
        System.out.println(str1.equals(str3));

        // 测试未重写equals方法的User对象
        System.out.println("测试未重写equals方法的User对象");
        User user1 = new User(1, "java");
        User user2 = new User(2, "python");

        System.out.println(user1.equals(user2));
        System.out.println(user1 == user2);

        user2 = user1;
        User user3 = user1;
        System.out.println(user2.equals(user3));
    }
}

复制代码
public class User {
    private Integer id;
    private String name;

    User(Integer id, String name) {
        this.id = id;
        this.name = name;
    }

    // ... getters and setters
}

复制代码

运行结果:

测试重写了equals方法的String类对象
true
false
测试未重写equals方法的User对象
false
false
true
复制代码

参考:

  1. Matrix海子——浅谈Java中的equals和==
相关文章
相关标签/搜索