1. == 和 equals
==
如果是基本类型,比较的是栈中的值;
如果是引用类型,比较的是栈中存储的地址;
equals
比较的是堆中的数据,即实际内容。
由于object和String分别重写了equals方法,看下源码:
object 实际也是使用==来比较
public boolean equals (Object o) {
return this == o;
}
String.equals(Object object) 比较的是两个字符串的内容
public boolean equals(Object object) {
if (object == this) {
return true;
}
if (object instanceof String) {
String s1 = this;
String s2 = (String) object;
int s1len = s1.lengthInternal();
int s2len = s2.lengthInternal();
if (s1len != s2len) {
return false;
}
char[] s1Value = s1.value;
char[] s2Value = s2.value;
if (s1Value == s2Value) {
return true;
}
// There was a time hole between first read of s.hashCode and second read if another thread does hashcode
// computing for incoming string object
int s1hash = s1.hashCode;
int s2hash = s2.hashCode;
if (s1hash != 0 && s2hash != 0 && s1hash != s2hash) {
return false;
}
if (!regionMatchesInternal(s1, s2, s1Value, s2Value, 0, 0, s1len)) {
return false;
}
if (com.ibm.oti.vm.VM.J9_JIT_STRING_DEDUP_POLICY != com.ibm.oti.vm.VM.J9_JIT_STRING_DEDUP_POLICY_DISABLED) {
deduplicateStrings(s1, s1Value, s2, s2Value);
}
return true;
}
return false;
}