java中有兩種數(shù)據(jù)類型:基本類型和引用類型。 基本類型有8個(gè): 整數(shù)類型 byte、short、int、long 浮點(diǎn)數(shù)類型 float、double 字符型 char 布爾類型 boolean 引用類型包括三種: 類 Class 接口 Interface 數(shù)組 Array 基本類型是通過(guò)諸如 int a = 5; long b = 6L;的形式來(lái)定義的,稱為自動(dòng)變量,自動(dòng)變量存放的是字面值,不是類的實(shí)例,它存放在內(nèi)存的堆棧中,數(shù)據(jù)大小和生存期必須是確定的,存取速度比較快,在堆棧中的字面值可以共享,也就是說(shuō)我們定義一個(gè)int a = 5;然后又定義了一個(gè)int b = 5;這時(shí)a與b在內(nèi)存中指向的是同一個(gè)字面常量。 引用類型一般是通過(guò)new關(guān)鍵字來(lái)創(chuàng)建,比如Integer num = new Integer(3);它存放在內(nèi)存的堆中,可以在運(yùn)行時(shí)動(dòng)態(tài)的分配內(nèi)存大小,生存期也不必事先告訴編譯器,當(dāng)引用類型變量不被使用時(shí),Java內(nèi)部的垃圾回收器GC會(huì)自動(dòng)回收走。引用變量中存放的不是變量的內(nèi)容,而是存放變量?jī)?nèi)容的地址。 在參數(shù)傳遞時(shí),基本類型都是傳值,也就是傳遞的都是原變量的值得拷貝,改變這個(gè)值不會(huì)改變?cè)兞浚妙愋蛡鬟f的是地址,也就是參數(shù)與原變量指向的是同一個(gè)地址,所以如果改變參數(shù)的值,原變量的值也會(huì)改變。這點(diǎn)要注意。 在java中,8種基本類型在java中都有對(duì)應(yīng)的封裝類型,也就是引用類型: 整數(shù)類型 Byte、Short、Integer、Long 浮點(diǎn)數(shù)類型 Float、Double 字符型 Character 布爾類型 Boolean 有時(shí)候我們會(huì)看到這樣的語(yǔ)句 Integer num = 3;Boolean b = true;這樣定義也能行得通,其實(shí)這里面有一個(gè)自動(dòng)裝箱的問題,即java自動(dòng)把3這個(gè)字面常量封裝成了Integer對(duì)象,同理也有自動(dòng)拆箱。 還有些需要注意的比較特殊的地方: 1.Integer類型 Integer i1 = 3; Integer i2 = 3; 此時(shí)i1 == i2 返回的是true Integer i1 = 128; Integer i2 = 128; 此時(shí)i1 == i2返回的是false, 這時(shí)因?yàn)镮nteger的數(shù)值在-128~127之間時(shí),即在int的范圍內(nèi),默認(rèn)是按照基本類型int來(lái)存放的,仍舊存在堆棧中,如果超出了int的范圍,就按照對(duì)象的方式來(lái)存放和比較了。 2、String類型 String類型我們有時(shí)候也會(huì)直接這樣定義: String s = "abc"; 這里的"abc"稱為字符串常量,也是存在堆棧中的,s中存放的就是指向這個(gè)堆棧地址的引用,如果再定義一個(gè) String s1 = "abc"; 這時(shí),s與s1存放的是同一個(gè)地址的引用,即s與s1指向的是同一個(gè)字符串常量, s == s1的值是true, 但是如果有 String s2 = new String("abc"); 這時(shí)s == s2則為false,因?yàn)槭褂胣ew之后,每次生成的對(duì)象都不是同一個(gè),即使存儲(chǔ)的內(nèi)容相同。 上面的s == s1,s == s2其實(shí)比較的都是地址,并不是里面的內(nèi)容。如果要比較內(nèi)容,可以使用equals()方法。
|