equal與==
1.最大的區別是,==是運算符,equal是方法
簡述幾種情況下的equal與==
java基本類型
比較包裝類型
比較String類型
比較對象
1.java基本類型(short,int,long,byte,char,float,double,boolean)
比較基本類型,只能用==,不能用equal,這里的==比較的是兩個變量的值
2.比較包裝類型
==比較的是內存地址,因為a和b是new出來的,是兩個不同的對象,所以地址肯定是不同的,而equal比較的是值,附上源碼
3.比較String類型
==比較的是內存地址,equal比較的是值
這里給出一道題,來供參考
這道題我們一步一步來解決,首先s1==s2,==比較的是內存地址,而s2是new出來的新對象,new String("xxxx")放在堆中,而s1的“xxxx”放在常量池中,所以比較結果是false
第二,s1==s5,字符串+的本質是創建了StringBulider對象進行append操作,然后將拼接后的StringBulider對象用toString進行處理,處理后生成的字符串放在字符串池中找有沒有相同值的字符串,如果有將引用(s5)直接連接到已有的字符串地址,所以s1和s5的地址相同
第三,s1=s3+s4,這個的原理是涉及到類加載時初始化的問題,s3和s4的結果無法在編譯期間確定,如果把s3和s4定義為final類型,結果就是true了,java在編譯時,就知道“Program”+"ming"="Programming"了,但卻是在運行時才知道s3+s4="Programming"
4.比較對象
==和equal比較的都是內存地址,因為equal沒有被重寫,沒有被重寫的equal都是object的equal方法
也能參考下面
1.“==”常用來比較基本數據類型,8種基本數據類型有byte、short、long、double、char、int、float、boolean,因為變量直接存儲的就是他們的值,所以用"=="去比較,比較的就是他們的值。
但是復合數據類型用“==”比較的是他的堆內存地址。
2.“equals”對於復合數據類型比較的也是它的堆內存地址(不能作用於基本數據類型的變量)。
但在實際項目中常用來比較String字符串的內容相等是為什么呢?
那是因為對於String(還有Date,Integer)類型重寫了equals方法,使其比較的是存儲對象的內容是否相等,而不是堆內存地址。
String str1 = "Hello"; String str5 = "Hello"; String str2 = new String("Hello"); String str4 = new String("Hello"); String str3 = str2; // 引用傳遞,同一對象 System.out.println(str1 == str2); // false(str2是new的一個新地址) System.out.println(str1 == str3); // false(str3和str2內存地址一樣,和str1地址不同) System.out.println(str2 == str3); // true(引用str2,地址相同) System.out.println(str1 == str5); // true(String作為基本類型,沒創建新地址) System.out.println(str4 == str2); // false(內存地址不同) System.out.println(str1.equals(str2)); // true(內容一致,都是“hello”) System.out.println(str1.equals(str3)); // true(內容一致,都是“hello”) System.out.println(str2.equals(str3)); // true(內容一致,都是“hello”) System.out.println(str2.equals(str4)); // true(內容一致,都是“hello”) System.out.println(str1.equals(str5)); // true(內容一致,都是“hello”)