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


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


关系操作符==

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

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

下面看测试代码:

    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类中的源码:

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对象才会相等

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

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

下面看测试代码:

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和==
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值