其他语言比较两个字符串是否相同通常用“==”,但在java中要用equals()。

一、“==”

“==”比较的是是否为同一个对象,两个不同的字符串对象,即使值是相同的,用“==”还是返回false。

举个例子:

String a = "helloworld";
String b = "helloworld";
String c = new String("helloworld");
System.out.println(a==b);        //输出true
System.out.println(a==c);        //输出false

为什么a==b返回true,而a==c返回false?

因为JVM为了提高性能和减少内存的开销,在实例化字符串的时候进行了一些优化:使用字符串常量池每当我们创建字符串常量时,JVM会首先检查字符串常量池,如果该字符串已经存在常量池中,那么就直接返回常量池中的实例引用。如果字符串不存在常量池中,就会实例化该字符串并且将其放到常量池中。由于String字符串的不可变性我们可以十分肯定常量池中一定不存在两个相同的字符串。

而用new则会创建一个新的对象(看了一篇大佬博客,好像意思是也是指向同一个常量,链接:,这边就理解为创建了一个新对象吧,具体可以自己去看)

理解了上面一段,就可以明白a和b是同一个字符串的引用,而a与c是不同的对象的引用,所以a==b输出true,a==c输出false。

那要想比较两个字符串对象的所有字符是否相同该如何比较,用equals()方法! 

二、equals()方法

equals()是根类Obeject中的方法,在实现时其实也是调用的“==”,但在String类中重写了此方法(见补充)。重写后的equals 方法比较两个字符串对象的所有字符是否相同。

equals如何使用?

例:A字符串和B字符串比较:

if(A.equals(B)){

}

 

三、补充

equals是根类Obeject中的方法。源代码如下:

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

可见默认的equals方法,直接调用==,比较对象地址。

不同的子类,可以重写此方法,进行两个对象的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;
}

从上面的代码中可以看到,

  (1)String类中的equals首先比较地址,如果是同一个对象的引用,可知对象相等,返回true。

  (2)如果不是同一个对象,equals方法挨个比较两个字符串对象内的字符,只有完全相等才返回true,否则返回false。