我们知道对于操作符 "==",如果比较的是原生类型(primitive type),表示的是 '值本身'是否相等;而对于引用类型(reference type),表示的是 '对象的地址'是否相等.
java中Object 类的源代码为(表示'对象地址'是否相等):
1 public boolean equals(Object obj) { 2 return (this == obj); 3 }
java中String类的源代码为(表示的是'字符串内容'是否相等):
1 public boolean equals(Object anObject) { 2 if (this == anObject) { 3 return true; 4 } 5 if (anObject instanceof String) { 6 String anotherString = (String)anObject; 7 int n = count; 8 if (n == anotherString.count) { 9 char v1[] = value; 10 char v2[] = anotherString.value; 11 int i = offset; 12 int j = anotherString.offset; 13 while (n-- != 0) { 14 if (v1[i++] != v2[j++]) 15 return false; 16 } 17 return true; 18 } 19 } 20 return false; 21 }
假设使用'=='来操作String(其实是不合理的,但是很多人都是这样用,包括我在内):
1 class StringDemo { 2 public static void main(String[] args) { 3 String s = "a"; 4 String s2 = "a"; 5 System.out.println(s == s2); //output 'true'. 6 7 String s3 = new String("b"); 8 String s4 = new String("b"); 9 System.out.println(s3 == s4); //output 'false'. 10 11 String s5 = "c"; 12 String s6 = new String("c"); 13 System.out.println(s5 == s6); //output 'false'. 14 15 } 16 }
equals 的使用总结:
Object 中的 equals 方法表示的是对象的地址是否相等;
String 继承了Object类,但是String类重写了equals 方法,比较的是'内容本身'.
可以说是百分之百,我们对于String的比较,比较的是内容本身是否相等,而不会是比较字符串对象是否相等,所以对于String类型的比较,请使用equals方法,而不要使用 '=='.