Java基础Android开发经验谈Java源码

【String源码】equals解析与使用

2019-07-15  本文已影响74人  秀叶寒冬

本文基于JDK1.8

1 String中equals源码分析

String是final类型,它不可被继承。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.
     *将这个字符串与指定对象进行比较,当且仅当参数不为空且参数是字符串,并与当前具有相同字符串序列时返回true
     * @param  anObject
     *         The object to compare this {@code String} against
     *
     * @return  {@code true} if the given object represents a {@code String}
     *          equivalent to this string, {@code false} otherwise
     *
     * @see  #compareTo(String)
     * @see  #equalsIgnoreCase(String)
     */
    public boolean equals(Object anObject) {
        if (this == anObject) {//#1
            return true;//#2
        }
        if (anObject instanceof String) {//#3
            String anotherString = (String)anObject;//#4
            int n = value.length;//#5
            if (n == anotherString.value.length) {//#6
                char v1[] = value;//#7
                char v2[] = anotherString.value;//#8
                int i = 0;//#9
                while (n-- != 0) {//#10
                    if (v1[i] != v2[i])//#11
                        return false;//#12
                    i++;//#13
                }
                return true;//#14
            }
        }
        return false;//#15
    }

英文解释看得不太明白,那就从代码方面看。其中涉及到 == 判断,如果不清楚的可以查看【Java】Java中的==

 /** The value is used for character storage. */
    private final char value[];

这里的value数组是final类型的,说明String类型的对象一旦赋值,则不能更改;如果更改,则会重新创建一个String对象。

2 equals使用

         // 例一
        String str = "wo";
        String str1 = "wo";
        System.out.println("例一:" + str.equals(str1));

        // 例二
        String str2 = new String("wo");
        String str3 = new String("wo");
        System.out.println("例二:" + str2.equals(str3));

结果

例一:true
例二:true

例一比较的是地址,因为str和str1指向的对象的地址是相等的,所以返回true;例二比较的是值,因为str2和str3指向对象的地址不相等,所以接着比较两个字符串对象的值,因为值是相等的,所以返回的是true。

3 总结

String中equals方法比较的是

  • 如果当前String对象与要比较的对象地址相等,则返回true
  • 如果当前String对象与要比较的对象地址不相等,那么判断要比较的对象是不是字符串类型,如果是字符串类型,则比较两个字符串中每个字符是否对应相等,如果对应相等则返回true。
  • 如果不对应相等,则返回false;如果两个对象地址不相等,且要比较的对象不是String类型,则返回false。
上一篇下一篇

猜你喜欢

热点阅读