Java基础-“==“和“equals“相等判断

在Java中有 “==” 和 “equals” 两个可以用做对象或变量的相等判断。

先说说操作符 “==”,由于没有找到啥官方文档对该操作符的说明,结合网上所学以及Java核心技术卷的一句解释:
在这里插入图片描述

总结说就是“==”操作符它判断的是两个对象的引用地址(堆内存)是否相等。
当适用于基本数据类型(byte, short, char, int, float, double, long, boolean)及其相应的包装类型(Byte, Short, Charater, Interger, Float, Double, Long, Boolean)时需要注意一下几点:
1.常量池:基本数据类型与String的变量会在常量池中存储,因此当直接赋值基本数据类型变量时如果值一样,那么返回true,但是String类型如果是采用new的方式新建对象则返回false(为什么不和包装类型一样存在常量池中?求解)。实例如下:
在这里插入图片描述
2.题外话:Float和Double是没有实现常量池的(在网上看到的)。但是我发现测试的时候依然是可以相等的,这是为啥?求解:
在这里插入图片描述
3.常量池存储的包装类型是有范围的。Integer的范围是-128-》127,当超出这个范围时就是在堆内存新建了一个地址而不是再去引用常量池中的那个地址。如下:
在这里插入图片描述

==操作符就说到这。

接下来说说“equals”方法
这个方法首先存在Object类中(所有的类都会默认继承这个类,也就默认继承了这个方法),先看源码:

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

再看官方文档:
在这里插入图片描述
关键字句是:

that is, for any non-null reference values x and y, this method returns true if and only if x and y refer to the same object (x == y has the value true).

即对于任何的非空值x和y,当且仅当x和y引用相同对象时,该方法才返回true。
也就是说默认情况下,equals方法和“==”操作符发挥的作用是一样的,都是判断引用的地址是否相等。
但是这是默认的情况,前面说到所有类默认继承Object,在Java中子类是可以重写父类方法的,因此就会出现一些根据特定情况需要的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字符串内的内容是否相同。
关于equals方法重写,需要注意的是,在官方API中最后一句话提到(看上图):重写equals方法的时候同时也要重写hashCode方法,因为该方法规定相等的对象必须具有相等的哈希码。
完毕。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值