String 在 Java 中并非9种基本类型之一
判断2个 Object 是否相等时通常用 == 或者 equals 来判断,== 判断的是内存地址,equals 判断的是内部的值
String 的 equals 实现时先判断是不是 ==,如果是同一个地址的 Object 直接返回相等,如果地址不同时,会先判断被比较的对象是否是一个String,如果不是直接返回不等,如果是就判断字符串长度,不同长度的直接返回不等,然后逐位比较字符,出现不等的返回不等,全部相等返回相等。
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;
}
实例:
package com.zsoft.test;
public class StringEqualsTest {
public static void main(String[] args) {
String a = "abcde";
String b = "abcde";
String c = "abcd";
System.out.println(a.hashCode());
System.out.println(b.hashCode());
System.out.println(c.hashCode());
System.out.println(a.equals(b));
System.out.println(a == b);
System.out.println(a.equals(c));
System.out.println(a == c);
}
}
输出:
92599395
92599395
2987074
true
true
false
false
此例还同时证明了初始化相同内容的 String 时候,实际只分配了同一个内存区域,两个变量指向的都是同一个内存地址。