如何正确比较两个字符串的值(==、equals)
问题背景:java知识基础不扎实,直接上手开发。判断字符串值时直接使用“==”进行判断。经同事指正,现记录一下。
JAVA如何判断两个字符串是否相等?
一句话概括:==比较引用,equals 比较值
1.java中字符串的比较:==
以前都会直接使用if(a==b),但这种写法在java中可能会出现问题。
例子1
String a="abc";
String b="abc";
if(a==b)
a==b将返回true。在java中字符串的值是不可改变的,相同字符串在内存中只会保存一份,所以a和b指向的是同一个对象。
例子2
String a=new String("abc");
String b=new String("abc");
if(a==b)
那么a==b将返回false,此时a和b指向不同的对象。
2.用equals方法比较的是字符串的内容是否相同
例子1
String a=new String("abc");
String b=new String("abc");
if(a.equals(b))
a.equals(b)将返回true
拓展:
在Object类的源码中有个equals()方法也可以用来比较俩个引用是否相同,它内部也是使用了 ==
public boolean equals(Object obj) {
return (this == obj);
}
但String类的equals()方法为什么当value值一样就返回true?
是因为String重写了equals()方法和hashCode()方法
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;
}
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
只要value相等就返回true