Java 數(shù)據(jù)類型及其判斷

一、Java中的數(shù)據(jù)類型,可分為兩類:

1.基本數(shù)據(jù)類型,也稱原始數(shù)據(jù)類型:

byte、short、char、int、long、float、double、boolean它們之間的比較,應(yīng)該用雙等號(==)比較的是它們的值。

2.引用數(shù)據(jù)類型:

JAVA當(dāng)中所有的類都是繼承于Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較變量(棧)內(nèi)存中存放的對象的(堆)內(nèi)存地址,用來判斷兩個對象的地址是否相同,即是否是指相同一個對象。比較的是真正意義上的指針操作。
但在一些類庫當(dāng)中這個方法被覆蓋掉了,如String、Integer、Date。在這些類當(dāng)中equals有其自身的實現(xiàn),而不再是比較類在堆內(nèi)存中的存放地址了。
對于引用數(shù)據(jù)類型之間進行equals比較,在沒有重寫equals方法的情況下,它們之間的比較還是基于它們在內(nèi)存中的存放位置的地址值的,因為Object的equals方法也是用雙等號進行比較的,所以比較后的結(jié)果跟雙等號的結(jié)果相同。

注意:

  1. 比較的是操作符兩端的操作數(shù)是否是同一個對象。
  2. 兩邊的操作數(shù)必須是同一類型的(可以是父子類之間)才能編譯通過。
  3. 比較的是地址。如果是具體的阿拉伯?dāng)?shù)字的比較,值相等則為true,如:
    int a=10 與 long b=10L 與 double c=10.0都是相同的(為true),因為他們都指向地址為10的堆。
  4. String s=“abc"是一種非常特殊的形式,和new 有本質(zhì)的區(qū)別。它是java中唯一不需要new就可以產(chǎn)生對象的途徑。以 String s=“abc”; 形式賦值在java中叫直接量,它是在常量池中而不是象new一樣放在壓縮堆中。這種形式的字符串,在JVM內(nèi)部發(fā)生字符串拘留,即當(dāng)聲明這樣的一個字符串后,JVM會在常量池中先查找有有沒有一個值為"abc"的對象。如果有,就會把它賦給當(dāng)前引用。即原來那個引用和現(xiàn)在這個引用指向了同一對象。如果沒有,則在常量池中新創(chuàng)建一個"abc”,下一次如果有 String s1 = “abc”; 又會將s1指向"abc"這個對象,即以這種形式聲明的字符串,只要值相等,任何多個引用都指向同一對象。
      而 String s = new String(“abcd”); 和其它任何對象一樣,每調(diào)用一次就產(chǎn)生一個對象,只要它們調(diào)用。
      也可以這么理解: String str = “hello”; 先在內(nèi)存中找是不是有"hello"這個對象,如果有,就讓str指向那個"hello"。如果內(nèi)存里沒有"hello",就創(chuàng)建一個新的對象保存"hello"。String str=new String (“hello”) 就是不管內(nèi)存里是不是已經(jīng)有"hello"這個對象,都新建一個對象保存"hello"。

具體可以看下面的代碼:

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){ 
            System.out.println("aa==bb");// true
         }       
         if (a == b){             
            System.out.println("a==b");// false,非同一對象 
         }      
        if (a.equals(b)){          
            System.out.println("aEQb");// true 
         }         
        if (42 == 42.0) {            
             System.out.println("true");15 // true   
        } 
     }
}

二、equals和==的區(qū)別

equals方法最初是在所有類的基類Object中進行定義的,源碼:

public boolean equals(Object obj) {    
   return (this == obj);
}

由equals的源碼可以看出這里定義的equals與雙等號是等效的(Object類中的equals與雙等號沒什么區(qū)別)。不同的原因就在于有些類(像String、Integer等類)對equals進行了重寫,但是沒有對equals進行重寫的類(比如我們自己寫的類)就只能從Object類中繼承equals方法,其equals方法與==就也是等效的,除非在此類中重寫equals。

對equals重新需要注意五點:
1??自反性:對任意引用值X,x.equals(x)的返回值一定為true。
2??對稱性:對于任何引用值x、y,當(dāng)且僅當(dāng)y.equals(x)返回值為true時,x.equals(y)的返回值一定為true。
3??傳遞性:如果x.equals(y)=true,y.equals(z)=true,則x.equals(z)=true。
4??一致性:如果參與比較的對象沒任何改變,則對象比較的結(jié)果也不應(yīng)該有任何改變。
5??非空性:任何非空的引用值X,x.equals(null)的返回值一定為false 。

String類對equals的重寫如下:

public boolean equals(Object var1) {
        if (this == var1) {
            return true;
        } else {
            if (var1 instanceof String) {
                String var2 = (String) var1;
                int var3 = this.value.length;
                if (var3 == var2.value.length) {
                    char[] var4 = this.value;
                    char[] var5 = var2.value;

                    for (int var6 = 0; var3-- != 0; ++var6) {
                        if (var4[var6] != var5[var6]) {
                            return false;
                        }
                    }
                    return true;
                }
            }
            return false;
        }
    }

另外,雙等號比"equals"運行速度快,因為雙等號"=="只是比較引用。

三、經(jīng)典案例

如果Integer a = 3;Integer b = 3;那么【a==b】的結(jié)果是什么?-----true
如果Integer a = 273;Integer b = 273;那么【a==b】的結(jié)果是什么?-----false

原因:對于Integer var = ?在-128至127范圍內(nèi)的賦值,Integer對象是在 IntegerCache.cache產(chǎn)生,會復(fù)用已有對象,這個區(qū)間內(nèi)的Integer值可以直接使用==進行判斷,但是這個區(qū)間之外的所有數(shù)據(jù),都會在堆上產(chǎn)生,并不會復(fù)用已有對象,推薦使用equals方法進行判斷。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容