1.首先說說java有8中資料類型:
浮點型:float(4 byte) double(8 byte)
整型:byte(1 byte), short(2 byte), int(4 byte) , long(8 byte)
字元型:char(2 byte)
布爾型:boolean(JVM規範沒有明确規定其所占的空間大小,僅規定其隻能夠取字面值”true”和”false”)
《Java程式設計思想》中有這樣一句話:
“關系操作符生成的是一個boolean結果,它們計算的是操作數的值之間的關系”。
看一個例子:
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=3;
int m=3;
System.out.println(n==m); **true**
String str = new String("hello");
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1==str2); **false**
str1 = str;
str2 = str;
System.out.println(str1==str2); **true**
}
}
其實隻要知道基本資料類型變量和非基本資料類型變量的差別。
對于java中8種基本資料類型的變量,變量直接存儲的是“值”,是以在用關系操作符==來進行比較時,比較的就是 “值” 本身。
int n=3;
int m=3;
變量n和變量m都是直接存儲的”3”這個數值,是以用==比較的時候結果是true。
String是引用類型,是以str1和str2是引用類型變量,引用類型的變量存儲的并不是 “值”本身,而是與其關聯的對象在記憶體中的位址。
String str1 = new String(“hello”);
String str2 = new String(“hello”);
變量str1,str2 中存儲的是它指向的對象在記憶體中的存儲位址,并不是“值”本身,
二者指向的是不同的對象,也就是說他們實際存儲的記憶體位址不同,==這裡比較的是他們的存儲的記憶體位址,是以傳回false。
str1 = str;
str2 = str;
System.out.println(str1==str2); true
讓str1和str2指向了str指向的對象,那麼他們存儲的記憶體位址是相同的,是以==比較結果為true。
equals:
在Object類中,equals方法是用來比較兩個對象的引用是否相等,即是否指向同一個對象。
String str1 = new String(“hello”);
String str2 = new String(“hello”);
System.out.println(str1.equals(str2)); true
為什麼會傳回true呢?
String類對equals方法進行了重寫,用來比較指向的字元串對象所存儲的字元串是否相等。
其他的一些類諸如Double,Date,Integer等,都對equals方法進行了重寫用來比較指向的對象所存儲的内容是否相等。
總結來說:
1)對于==,如果作用于基本資料類型的變量,則直接比較其存儲的 “值”是否相等;
如果作用于引用類型的變量,則比較的是所指向的對象的位址
2)對于equals方法,注意:equals方法不能作用于基本資料類型的變量
如果沒有對equals方法進行重寫,則比較的是引用類型的變量所指向的對象的位址;
諸如String、Date等類對equals方法進行了重寫的話,比較的是所指向的對象的内容。