Java基础------equals方法

记得之前学习java基础的那会儿觉得这个方法是真的神奇,字符串对象调用它就可以判断两个字符串的内容是否相同。而Object对象调用它判断的却是对象的内存地址是否相同。

此后在做字符串内容是否相同的判断时,我总是会想到equals方法,直到最近我发现另一种语法貌似也可以达到相同的效果,StringUtils.pathEquals("qwe", ""),不过这个方法不是今天的主角,它让我忽然想起我一直没有好好去了解一下String类下的equals方法是如何实现的?首先,先来看一下Object类中的equals方法:

 

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

 

实际上只有一行代码,就是判断一下两个Object对象的内存地址是否相同,也就是说这两个对象是否为同一个。

调用这个方法的话,即便是两个对象的内容完全相同,在内存地址不同的情况下,依然会返回null。

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方法,首先还是判断了内存地址是否相同,如果内存地址相同的话说明二者是同一个对象,那么内容自然也是相同的,直接返回true即可。

然后判断传入的对象是否为String类的实例,如果不是则直接判定为false。

然后将传入对象转为String,获取到二者的value,这东西实际上是一个字符数组,也就是String的本体所在,首先对比长度,长度如果不一致,则内容一定不一致,长度一致则将字符数组中的元素取出一一对比,如果皆一致则判定为内容一致。

这小小的一个方法封装的很细致,也很严谨,值得学习。

 

posted @ 2020-09-24 16:03  无心大魔王  阅读(273)  评论(0编辑  收藏  举报