【Java源码】String中的equals方法

本文基于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。
发布了107 篇原创文章 · 获赞 142 · 访问量 13万+

猜你喜欢

转载自blog.csdn.net/u013293125/article/details/95921650