基本數(shù)據(jù)類型
- 基本數(shù)據(jù)類型浑吟,也稱原始數(shù)據(jù)類型撮慨,byte.short,int,long,char,boolean,fload,double。
他們之間的比較應(yīng)用雙等號(==)霎终,比較是他們的值灸促。 - 引用數(shù)據(jù)類型
引用類型用==比較的是他們內(nèi)存地址是否相同诫欠,當(dāng)符合數(shù)據(jù)類型之間進(jìn)行equals比較時,這個方法的出事行為是比較對象在堆內(nèi)存中的地址浴栽。
equals()方法是用來判斷其他的對象是否和該對象相等
對于重寫了equals()方法的荒叼,比較的是內(nèi)容的比較。而基本類型是比較的值典鸡。
Sting類的討論
String a = "abc";
String b = "abc";
System.out.println(a == b);//true
輸出true
說明:==在進(jìn)行復(fù)合數(shù)據(jù)類型比較時被廓,比較的是內(nèi)存中的存放地址。因此a與b引用同一個String對象萝玷。
String b = "abc";
String c = new String("abc");
System.out.println(c == b);//false
System.out.println(c.equals(b));//true
輸出:
false
true
說明:b,c分別引用了兩個對象嫁乘。顯然,兩者內(nèi)容是相同的球碉,因此equal返回true蜓斧。第一個例子也一樣。
范例
String str1= "hello";
String str2= new String("hello");
String str3= str2;
從圖中可以發(fā)現(xiàn)每個String對象的內(nèi)容實際是保存到堆內(nèi)存中的睁冬,而且堆中的內(nèi)容是相等的挎春,但是對于str1和str2來說所指向的地址堆內(nèi)存地址是不等的,所以盡管內(nèi)容是相等的豆拨,但是地址值是不相等的
“==”是用來進(jìn)行數(shù)值比較的直奋,所以str1和str2比較不相等,因為str2和str3指向同一個內(nèi)存地址所以str2和str3是相等的施禾。所以“==”是用來進(jìn)行地址值比較的脚线。
- 為什么Java中1000==1000為false而100==100為true?
Integer i1 = 100, i2 = 100;
System.out.println(i1 == i2);//true
Integer i3 = 1000, i4 = 1000;
System.out.println(i3 == i4);//fales
查看Integer.java類弥搞,會發(fā)現(xiàn)有一個內(nèi)部私有類邮绿,IntegerCache.java,它緩存了從-128到127之間的所有的整數(shù)對象拓巧。
所以i1 == i2 為true斯碌。
== : 它的作用是判斷兩個對象的地址是不是相等一死。即肛度,判斷兩個對象是不是同一個對象(基本數(shù)據(jù)類型==比較的是值,引用數(shù)據(jù)類型==比較的是內(nèi)存地址)投慈。
equals() : 它的作用也是判斷兩個對象是否相等承耿。但它一般有兩種使用情況:
- 情況1:類沒有覆蓋 equals() 方法冠骄。則通過 equals() 比較該類的兩個對象時,等價于通過“==”比較這兩個對象加袋。
- 情況2:類覆蓋了 equals() 方法凛辣。一般,我們都覆蓋 equals() 方法來比較兩個對象的內(nèi)容是否相等职烧;若它們的內(nèi)容相等扁誓,則返回 true (即,認(rèn)為這兩個對象相等)蚀之。
舉個栗子:
public class test1 {
public static void main(String[] args) {
String a = new String("ab"); // a 為一個引用
String b = new String("ab"); // b為另一個引用,對象的內(nèi)容一樣
String aa = "ab"; // 放在常量池中
String bb = "ab"; // 從常量池中查找
if (aa == bb) // true
System.out.println("aa==bb");
if (a == b) // false蝗敢,非同一對象
System.out.println("a==b");
if (a.equals(b)) // true
System.out.println("aEQb");
if (42 == 42.0) { // true
System.out.println("true");
}
}
}
說明:
- String 中的 equals 方法是被重寫過的,因為 object 的 equals 方法是比較的對象的內(nèi)存地址足删,而 String 的 equals 方法比較的是對象的值寿谴。
- 當(dāng)創(chuàng)建 String 類型的對象時,虛擬機(jī)會在常量池中查找有沒有已經(jīng)存在的值和要創(chuàng)建的值相同的對象失受,如果有就把它賦給當(dāng)前引用讶泰。如果沒有就在常量池中重新創(chuàng)建一個 String 對象。