美文网首页Java基础Android开发经验谈Java源码
【String源码】equals解析与使用

【String源码】equals解析与使用

作者: 秀叶寒冬 | 来源:发表于2019-07-15 09:01 被阅读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中的==

    • 第#1行,因为this指向的是当前String类,所以这里判断的是传入的Object对象与当前String对象的地址是否相等,即是否指向同一个String对象,如果是,则返回true(第#2行)。
    • 第#3行判断指定的类型是否是String类型,如果是,则进行第#4操作;如果不是,则执行#15操作。
    • 第#4行,因为传入的对象是String类型,所以将anObject强制转换为String类型,并赋值给anotherString
    • 第#5行,计算字符串长度。value指的是存储String值的一个字符数组,其源码如下所示
     /** The value is used for character storage. */
        private final char value[];
    

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

    • 第#6行,如果anotherString的长度与当前字符串长度相等,则进行#7
    • 第#7行,创建一个v1字符数组,将当前字符串的字符数组赋值给v1
    • 第#8行,创建一个v2字符数组,将anotherString的字符数组赋值给v2
    • 第#9行,设置一个遍历角标i,并设置i=0
    • 第#10行,使用while循环,这里很有意思,循环控制条件是当前字符串长度每次减一,直到0为止。
    • 第#11行,判断同角标处的字符是否相等,如果不相等,返回false(第#12行);如果相等,进行第#13行,继续循环
    • 第#13行,i计数加1
    • 第#14行,返回true,表示当前字符串中的字符与传入的参数字符全部相等。
    • 第#15行,执行这一行时,表示传入的参数(1)与当前String对象的地址不相等;(2)不是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。

    相关文章

      网友评论

        本文标题:【String源码】equals解析与使用

        本文链接:https://www.haomeiwen.com/subject/ipkgkctx.html