看似普通的方式equals

我们知道,每个类都一个equals方法,或者是从基类Object那里继承过来的,或者是自己实现的,而且实现多样。

这里来看一下String这个在java里使用最多且没有之一的类里的equals方法是如何实现这个equals方法的。

首先上一小段代码:

String a = new String("adf");
        String b = new String("adf");
        boolean equals = a.equals(b);
        System.err.println(equals);
这要在我看String这个类的equals方法源码之前,还真不能给出一个确定的答案。那么就从其源码来一探究竟,String实现的equals源码如下:

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

首先可以看到,在第一个条件判断语句中是先判断比较对象与其本身内存地址指向是否一致,显然我们是new出来的两个“值”为“adf”的对象,二者在堆内存中被开辟有两块不同的空间,那么 a 和 b 的指向自然就不相同了(图示如下)。



继续上边源码分析,在第二个条件判断中,会以底层数组方式来比较二者(a以{‘a’, 'd’, 'f'}b以{‘a’, 'd’, 'f'}方式存储),自然为true。

有一点需要声明的是,在可以使用String strName = "...";方式表示一个字符串的时候尽量不要使用new的方式创建,这种情况在频繁运行该代码片的时候极其占用CPU时间。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值