前言
== 和 equals 的區別是什麼?
這似乎是每個java程序員都看過的一道題,簡單,確實理解非常簡單,根本不用怎麼理會。
但是前段時間面試,我有對一些2-3年的求職者問過這個問題。
不過我問的不是區別是什麼,我只是問了,你有點進去看過源碼麼?
(同樣,你有點進去看過源碼麼?這句話似乎是我面試別人的時候說的最多的一句話。)
爲什麼這麼喜歡說這個? 我就是單純地想看看有沒有看源碼的習慣。
得到很多答案都是: 沒有,但是我知道他們的區別和怎麼使用。 ok的,這樣也是ok的。
正文
俺今天就非得讓看到這個文章的人,理會理會一些它。
不囉嗦,接下來跟我一起看一眼 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;
}
分析:
part1
part2
part3
ps: String裏面的value 就是char[ ]數組,這個應該大家都該知道。
對象的equals
源碼:
public boolean equals(Object obj) {
return (this == obj);
}
分析:
對象的equals比較非常直接,就是引用的內存地址的比較,不一樣就false。
所以這也是爲啥有些時候需要重寫equals方法的原因,寫成符合業務的比較邏輯
看源碼,我的個人觀點是,不求完全看懂,但是要看得細。
所謂看細節,不是說每行都看那就叫看得細,而是要持有敏感度,能抓住關鍵點,那才叫看得細。
這也是爲啥有的大佬,看源碼的時候速度快還又能找到問題所在點。
多看看源碼,對於剛出來的小夥,只有好處沒有壞處。