Java中equals方法和==有什么区别

我们先上结论喽:

  1. ==要求比较严格,要求两个对象必须是同一个对象;
  2. equals方法,判断完了是否是同一个对象,会继续判断两个对象的值是否相同,他的要求没那么严格,只要值相同,就好了。

1、背景

今儿看了一个Java.class文件,
发现for循环中有个++i
于是就去查了下,
Java是用什么语言编写的,
得到的答案是,
Java的虚拟机是使用C语言和汇编编写的,
上层是用Java语言本身,
然后又看了一下那个.class文件,
忽然一拍脑门,
Java本来就有前置自增啊!!!!
为什么会有去查“Java是用什么语言编写的”这个问题的冲动呢?
潜意识中,觉着前置自增是C语言或者C++语言才有的,
后面,垂死病中惊坐起,
卧槽,我大Java语言本来就有前置自增!

下面贴一下那个.class文件中的代码:

	// 以下equals方法,出自 openjdk1.8.0.41
	// openjdk version "1.8.0_41"
	// OpenJDK Runtime Environment (build 1.8.0_41-b04)
	// OpenJDK 64-Bit Server VM (build 25.40-b25, mixed mode)
	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;
    }

熟悉的朋友,肯定一眼就瞄出来了,这不是java.lang.String类的equals方法嘛!

2、源码面前,了无秘密

很喜欢侯捷老师的这句话,既然想知道equals方法和==有什么区别,我们就去看看源码呗,来,上Demo

public class EqualTest {
    public static void main(String[] args) {
        String str1 = "hello, world";
        String str2 = "hello, world";
        String str3 = str1;

        if (str1.equals(str2)) {
            System.out.println("str1 is equal to str2.");
        }
        if (str1 == str3) {
            System.out.println("str1 == str3");
        }
    }
}

如你所想,程序的输出是:

str1 is equal to str2.
str1 == str3

我们再来看另一个版本的equals方法的实现:

	// Oracle的 java 1.8
	// java version "1.8.0_201"
	// Java(TM) SE Runtime Environment (build 1.8.0_201-b09)
	// Java HotSpot(TM) 64-Bit Server VM (build 25.201-b09, mixed mode)

    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;
    }

看了两个版本的equals方法,发现他们的实现,其实都一样

  1. 先比较传入的参数是不是自己(同一个对象的引用,hashCode相同),如果是自己,直接返回true
  2. 之后判断两个对象value的长度是否相等,不相等直接返回false
  3. 判断每个char是否相同,不相同返回false
  4. 如果都成立,当然是返回true喽;

所有我们得到结论:

  1. ==要求比较严格,要求两个对象必须是同一个对象;
  2. equals方法,判断完了是否是同一个对象,会继续判断两个对象的值是否相同,他的要求没那么严格,只要值相同,就好了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值