說在前面
最近很煩,項目遇上坑爹的期末,無論負(fù)責(zé)人怎么催,還是輸給了課程設(shè)計。遇上不可抗力的因素,真的沒法子了。
問題描述
今天就要去面試廣州南天了,一面和筆試都是裸著進(jìn)去的,結(jié)果過了,讓我去公司面試,對了,我大三,下學(xué)期是否實習(xí)講真的我也沒有個明確的想法,我還是很希望下學(xué)期能將現(xiàn)在做的產(chǎn)品推出去的,好了,不說那么多了,今天在隨機(jī)看一些面試題的時候發(fā)現(xiàn)對==好equals的區(qū)別點不大清晰,所以咯,一邊吐槽期末,一邊寫博客了。
java中的數(shù)據(jù)類型,可分為兩類:
- 基本數(shù)據(jù)類型
也稱原始數(shù)據(jù)類型。byte,short,char,int,long,float,double,boolean
他們之間的比較,應(yīng)用雙等號(==),比較的是他們的值。- 復(fù)合數(shù)據(jù)類型(類)
當(dāng)他們用(==)進(jìn)行比較的時候,比較的是他們在內(nèi)存中的存放地址,所以,除非 是同一個new出來的對象,他們的比較后的結(jié)果為true,否則比較后結(jié)果為false。 JAVA當(dāng)中所有的類都是繼承于Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的內(nèi)存地 址,但在一些類庫當(dāng)中這個方法被覆蓋掉了,如String,Integer,Date在這些類當(dāng)中equals有其自身的實現(xiàn),而不再是比較類在堆內(nèi)存中的存放地址了。
老規(guī)矩,以源碼為導(dǎo)向
Demo1
public class Demo1 {
public static void main(String[] args) {
String s1 = "Wednesday";
String s2 = "Wednesday";
if (s1 == s2) {
System.out.println("s1 == s2");
} else {
System.out.println("s1 != s2");
}
}
}
運行后的結(jié)果如下:s1 == s2
原因分析:
編譯并運行程序,輸出:s1 == s2說明:s1 與 s2 引用同一個 String 對象 -- "Wednesday"!程序在運行的時候會創(chuàng)建一個字符串緩沖池當(dāng)使用 s2 = "Wednesday" 這樣的表達(dá)是創(chuàng)建字符串的時候,程序首先會在這個String緩沖池中尋找相同值的對象,在第一個程序中,s1先被放到了池中,所以在s2被創(chuàng)建的時候,程序找到了具有相同值的 s1,將s2引用s1所引用的對象"Wednesday",所以在輸出結(jié)果的時候
Demo2源碼:
public class Demo2 {
public static void main(String[] args) {
String s1 = "Wednesday";
String s2 = new String("Wednesday");
if (s1 == s2) {
System.out.println("s1 == s2");
} else {
System.out.println("s1 != s2");
}
if (s1.equals(s2)) {
System.out.println("s1 equals s2");
} else {
System.out.println("s1 not equals s2");
}
}
}
運行后的結(jié)果如下:
s1 != s2
s1 equals s2
原因分析:
編譯并運行程序,輸出: s1 != s2,說明了s1 s2分別引用了兩個"Wednesday"String對象,與demo1的區(qū)別在于這里是new了一個對象出來,使用了 new 操作符,他們的值相同,但是位置不同,所以導(dǎo)致s1!=s2,而equals被覆蓋掉成比較值了,所以輸出 s1 equals s2。
Demo3
public class Demo3 {
public static void main(String[] args) {
String s1 = "Wednesday";
String s2 = new String("Wednesday");
s2 = s2.intern();
if (s1 == s2) {
System.out.println("s1 == s2");
} else {
System.out.println("s1 != s2");
}
if (s1.equals(s2)) {
System.out.println("s1 equals s2");
} else {
System.out.println("s1 not equals s2");
}
}
}
運行后的結(jié)果如下:
s1 == s2
s1 equals s2
原因分析:
java.lang.String的intern()方法"Wednesday".intern()方法的返回值還是字符串"Wednesday",表面上看起來好像這個方法沒什么用處。但實際上,它做了個小動作:檢查字符串池里是否存在"Wednesday"這么一個字符串,如果存在,就返回池里的字符串;如果不存在,該方法會 把"Wednesday"添加到字符串池中,然后再返回它的引用,而在demo3中我們可以看到Wednesday這個字符串已經(jīng)在字符串池中了,所以結(jié)果才會是s1 == s2 s1 equals s2。
Note:發(fā)布的這些文章全都是自己邊學(xué)邊總結(jié)的,難免有紕漏,如果發(fā)現(xiàn)有不足的地方,希望可以指出來,一起學(xué)習(xí)咯,么么噠。
開源愛好者,相信開源的力量必將改變世界:
??osc??? : https://git.oschina.net/xi_fan
github: https://github.com/wiatingpub