关于String类重写的equals方法源码的一点解读

 官方给出的解释是:

Compares this string to the specified object.  The result is {@code true} if and only if the argument is not {@code null} and is a {@code String} object that represents the same sequence of characters as this object.

翻译过来意思是:将此字符串与指定对象进行比较。当且仅当参数不是null并且是一个与此对象具有相同的字符序列的String对象时,结果为true。

查看源码,总的来说,equals方法首先检查对象是否在内存中相同(即两个引用指向内存中同一对象),然后检查实参是否是String类的实例,接着检查二者是否使用相同的编码(如果适用),最后比较实际的字符串值。如果所有这些条件都满足,方法返回true,表示两个String对象是相等的。

下面逐行解读:

    public boolean equals(Object anObject) {
        //比较内存中地址是否相同,返回true则表示二者指向内存中同一对象,一定相等
        if (this == anObject) {
            return true;
        }
        return (anObject instanceof String aString)
               //检查形参是否为String实例
                && (!COMPACT_STRINGS || this.coder == aString.coder)
               /*
                *1.COMPACT_STRINGS是一个布尔常量,它用于启用或禁用紧凑字符串存储。
                *在Java9中引入了紧凑字符串存储,它可以减少字符串对象的内存消耗。
                *如果COMPACT_STRINGS被设置为true,那么字符串会以一种更紧凑的方式存储。
                *2.这行代码检查了字符串是否使用相同的编码
                *如果COMPACT_STRINGS未设置或者编码相同,则继续进行下一步的检查
                */
                && StringLatin1.equals(value, aString.value);
    }

最后一行代码调用了StringLatin1的equals方法,简单来说是对每一个字符挨个比较。

    public static boolean equals(byte[] value, byte[] other) {
        if (value.length == other.length) {
        //两数组长度相等,挨个比较每个字符,不一样则返回false
            for (int i = 0; i < value.length; i++) {
                if (value[i] != other[i]) {
                    return false;
                }
            }
            return true;
        }
        return false;//如果两个数组长度不等直接返回false
    }

  • 11
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值