原始數據類型-包括byte,short,int,long, float,double,boolean和char
type | Size | Range | default |
---|---|---|---|
byte | 1字節(Byte)/8位(bit) | -128(-2^7) to 127(2^7-1) | 0 |
short | 2字節(Byte)/16位(bit) | -32768(-2^15) to 32767(2^15 - 1) | 0 |
int | 4字節(Byte)/32位(bit) | -2,147,483,648(-2^31) to 2,147,483,647(2^31 - 1) | 0 |
long | 8字節(Byte)/64位(bit) | -9,223,372,036,854,775,808(-2^63) to 9,223,372,036,854,775,807(2^63 -1) | 0L |
float | 4字節(Byte)/32位(bit) | -2^128 to +2^128 | 0.0f |
double | 8字節(Byte)/64位(bit) | -2^1024 to +2^1024 | 0.0d |
boolean | 1位(bit) | true or false | false |
char | 2字節(Byte)/16位(bit) | \u0000(即爲0) to \uffff(即爲65535) | ‘u0000’ |
float的範圍爲-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的範圍爲-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。
Float和Double的最小值和最大值都是以科學記數法的形式輸出的,結尾的"E+數字"表示E之前的數字要乘以10的多少次方。比如3.14E3就是3.14 × 103 =3140,3.14E-3 就是 3.14 x 10-3 =0.00314。
非原始數據類型 - 例如字符串,數組和 類
非原始數據類型稱爲引用類型,因爲它們引用對象。
之間的主要區別原始和非原始數據類型爲:
- 原始類型是在Java中預定義的(已定義)。非原始類型由程序員創建,不由Java定義(除外String)。
- 非基本類型可用於調用方法以執行某些操作,而基本類型則不能。
- 基本類型總是一個值,而非基本類型可以是null。
- 基本類型以小寫字母開頭,而非基本類型以大寫字母開頭。
- 基本類型的大小取決於數據類型,而非基本類型具有相同的大小。
類型自動轉換
byte- > short- > char- > int- > long- > float- >double
類型自動轉換示意圖:(實線表示自動轉換時不會造成數據丟失,虛線則可能會出現數據丟失問題。)
強制類型轉換
double- > float- > long- > int- > char- > short- >byte
事例:
int a = 100000000;
int b = 1000;
long c = a * b;
編譯沒任何問題,但結果卻輸出的是負數
因爲兩個 int 相乘得到的結果是 int, 相乘的結果超出了 int 的代表範圍(簡稱:溢出),一般把第一個數據轉換成範圍大的數據類型與其運算
解決事例:
int a = 100000000;
int b = 1000;
long c = (long)a * b;
直接將 int 常量字面量賦值給 byte、short、char 等數據類型,而不需要強制轉換,只要該常量值不超過該類型的表示範圍都能自動轉換
強制類型轉換
double a = 9.78;
int b = (int) a;
不同數據類型的表達式中,類型會自動向範圍表示大的值的數據類型提升。
事例:
long a = 100000000;
int b = 1000;
long c = a * b;
int 和 String類型轉換
int -> String
int i=12345;
String s="";
第一種方法:s=i+""; //會產生兩個String對象
第二種方法:s=String.valueOf(i); //直接使用String類的靜態方法,只產生一個對象
第三種方法:String s = Integer.toString(i);
String -> int
s="12345";
int i;
第一種方法:i=Integer.parseInt(s);
//直接使用靜態方法,不會產生多餘的對象,但會拋出異常
第二種方法:i=Integer.valueOf(s).intValue();
//Integer.valueOf(s) 相當於 new Integer(Integer.parseInt(s)),也會拋異常,但會多產生一個對象
在轉換過程中需要注意,因爲字符串中可能會出現非數字的情況,所以在轉換的時候需要捕捉處理異常
String str = "12345";
try {
int a = Integer.parseInt(str);
} catch (NumberFormatException e) {
e.printStackTrace();
}
try {
int b = Integer.valueOf(str).intValue()
} catch (NumberFormatException e) {
e.printStackTrace();
}