標籤:
一、資料類型
Java中主要有8中基礎資料型別 (Elementary Data Type),分別是byte,short,int,long,char,boolean,float,double,具體如下:
1、boolean:資料值只有true或false,適用於邏輯計算。
2、char:char型(字元型)資料在記憶體中佔用2個位元組。char型資料用來表示通常意義上的字元,每個字元佔2個位元組,Java字元採用Unicode編碼,它的前128位元組編碼與ASCII相容字元的儲存範圍在\u0000~\uFFFF,在定義字元型的資料時候要注意加‘ ‘,比如 ‘1‘表示字元‘1‘而不是數值1,
3、byte:byte型(位元組型)資料在記憶體中佔用1個位元組,表示的儲存資料範圍為:-128~127。
4、short:short型(短整型)資料在記憶體中佔用2個位元組。
5、int:int型(整型)資料在記憶體中佔用4個位元組。
6、long:long型(長整型)資料在記憶體中佔用8個位元組。
7、float:float型(單精確度浮點型)資料在記憶體中佔用4個位元組。(float精度為7-8位)
8、double:double型(雙精確度浮點型)資料在記憶體中佔用8個位元組。
Java中所有的基礎資料型別 (Elementary Data Type)都有固定的儲存範圍和所佔記憶體空間的大小,而不受具體作業系統的影響,來保證Java程式的可移植性。整形資料預設為int資料類型,浮點型預設為double資料類型,如果要表示long型資料或float型資料,要在相應的數值後面加上l、L或f、F,否則會出現編譯問題。
在其他語言中如C語言中,字元型資料和整型資料是可以相互轉換的,都是以ASCII碼來儲存,可以將字元型資料當整型資料來看待。
二、基礎資料型別 (Elementary Data Type)間的轉換
1、boolean類型不能轉換成任何其他資料類型。
2、自動類型轉換:容量小的資料類型可以自動轉換成容量大的資料類型,如byte-short-int-long-float-double。byte、short、int不會互相轉換,他們三者在計算時會轉換成int類型。
例:int a=257;byte b=(byte)a;在java中,int類型佔4個位元組,byte佔一個位元組,故int類型轉化為byte類型會出現位丟失情況,即將int的低4位作為byte類型的值。int型變數的值為257,對應的二進位是100000001,後8位是00000001,第一個0表示符號位,表示正數,所以變數b的值為1。
【備忘:在電腦中,儲存資料是通過記憶體位址來區分不同資料的,記憶體位址用十六進位數表示。在電腦儲存單元中,一個ASCII碼值佔一個位元組(8個二進位位),其中最高位符號位。事實上,電腦內的位元值是以補碼形式表示的,正數的補碼和原碼的形式相同,負數的補碼是將該數的絕對值的二進位形式,按位取反再加一。】
int a=128;byte b=(byte)a;這時b的值是-128。因為變數a對應的二進位是10000000,對應第一位符號位是1,則a是負數,其負數的補碼仍是10000000,故b的值是-128。
3、強制類型轉換:容量大的資料類型轉換成容量小的資料類型時,要加上強制轉換符,但這樣有可能會造成精度降低或者資料溢出,要小心。
三、對象封裝器
Java為了能將基本類型(primitive type)視為對象來處理,並能串連相關的方法,Java為每個節本類型都提供了相應的封裝類,這樣便能將基本類型轉化為對象來處理。其對應關係表如下所示:
基礎資料型別 (Elementary Data Type) |
封裝類 |
byte(位元組) |
java.lang.Byte |
char(字元) |
java.lang.Character |
short(短整型) |
java.lang.Short |
int(整型) |
java.lang.Integer |
long(長整型) |
java.lang.Long |
float(浮點型) |
java.lang.Float |
double(雙精確度) |
java.lang.Double |
boolean(布爾型) |
java.lang.Boolean |
封裝器類的使用
專門用來包裹(Wrap)基本類型的類叫封裝類,也叫封裝器,如Long,Integer等,其主要目的就是提供一個對象執行個體作為殼,將其基本類型包到這個對象之中,然後提供很多操作資料的方法,使物件導向的編程變得更加容易。
字串、封裝類、未經處理資料類間的轉換
四、裝箱和拆箱
在Java SE 5.0之前,要進行操作後才能將int封裝為一個Integer類。JDK 5.0為基礎資料型別 (Elementary Data Type)提供了自動裝箱(boxing)和拆箱(unboxing)的功能。
boxing:將基礎資料型別 (Elementary Data Type)封裝秤對應的封裝類對象。
unboxing:將封裝類對象轉換成對應的基礎資料型別 (Elementary Data Type)。
Java編譯器在編譯時間期會根據原始碼的文法來決定是否進行裝箱和拆箱。在運算時,也可以進行自動裝箱和拆箱。
五、泛型泛型只是編譯時間的概念,是供編譯器進行語法檢查用的(由於程式員需要一種型別安全的集合,故這種需求產生了泛型)。使用泛型的目的主要有以下兩個方面:
- 努力將運行時的異常轉換成編譯時間錯誤,減少運行時異常數量(提高了編譯器的能力)。
- 解決模版編程的問題。
//不用泛型 List list0 = new ArrayList(); list0.add("hello"); String str0 = (String) list0.get(0); //用泛型,這樣在擷取對象的時候就不用類型轉換 List<String> list = new ArrayList<String>(); list.add("hello"); String str = list.get(0);
- //不用泛型
- List list0 = new ArrayList();
- list0.add("hello");
- String str0 = (String) list0.get(0);
- //用泛型,這樣在擷取對象的時候就不用類型轉換
- List<String> list = new ArrayList<String>();
- list.add("hello");
- String str = list.get(0);
注意:
泛型是沒有數組的。編譯器不承認 HashMap<K,V>[]這種形式的: Cannot create a generic array of HashMap<k,v>
原因就是
數組必須確定他每一個元素的類型。但是泛型在編譯階段有一個類型擦除的問題,也就是說編譯器理解HashMap<Integer,Integer>和HashMap<String,String>都是同一種類型HashMap。如果泛型數組存在,那麼HashMap<Integer,Integer>和HashMap<String,String>對象都可以加入到同一個HashMap[]數組中,這會造成災難性的結果。
詳細原因可以看這篇部落格 http://hxraid.iteye.com/blog/549509
如果一定要定義HashMap數組,可以使用HashMap[] aTweightList = new HashMap[10]; 形式,也就是
HashMap常規類型。
Java資料類型