Java資料型別拓展知識
一、整數
定義整數型別時,不同進位制數字的寫法不同。
//整數拓展:進位制 二進位制0b 八進位制0 十進位制 十六進位制0x
int i = 0b10; //二進位制0b
int i2 = 010; //八進位制0
int i3 = 10;
int i4 = 0x10; //十六進位制0x 0~9 , A~F
將 i,i2,i3,i4 按順序輸出,得到的結果分別為2,8,10,16。
二、浮點數
計算機在處理浮點數時,是有誤差的。因此在程式中,不要用 ‘==’ 比較浮點數大小,容易出錯。下面舉兩個例子進行說明:
float f = 0.1f;
double d = 1.0/10;
System.out.println(f==d);
顯然,f = d = 0.1,但是此程式得到的結果為false。
我們再嘗試將下面兩個浮點數進行比較:
float f2 = 23131312313131f;
float f3 = f2+1;
System.out.println(f2==f3);
f3 = f2+1,我們可以明顯看出兩數不相等,但是此程式輸出的結果為true。
由上面兩個例子可知,在Java中,浮點數的運算結果並不精確。
但我們在使用Java開發的過程中,有時會涉及金額處理的問題,需要進行小數的運算。針對這種情況,我們需要使用BigDecimal數學工具類,該類位於java.maths類包下,可以很好地解決浮點數計算無法精確計算的問題 。
三、字元
我們對字元進行強制型別轉換,將其轉換為數字。如下所示:
char c1 = 'a';
char c2 = '中';
System.out.println(c1);
System.out.println((int)c1); //強制轉換
System.out.println(c2) ;
System.out.println((int)c2); //強制轉換
最終輸出結果為:a,97,中,20013。
其中,97和20013其實是字元 ‘a’ 和字元 ‘中’ 所對應的Unicode編碼值。
Unicode編碼值的範圍是從U0000到UFFFF。
下面,我們嘗試使用Unicode編碼值,輸出其對應的字元:
char c3 = '\u0061';
System.out.println(c3);
最終輸出結果為 a,即此編碼對應的字元為 ‘a’ 。(注意,0061是十六進位制數,換算成十進位制數為97,也就是上面的例子中,a所對應輸出的整數值。)
下面,我們簡單介紹兩種常見的轉義字元,空格符以及換行符:
//轉義字元
// \t 空格(製表符)
// \n 換行
System.out.println("Hello\tWorld");
System.out.println("Hello\nWorld");
輸出結果如下所示:
接下來我們再對比兩種不同的字串定義方式。
如下所示,我們 new 兩個相同的字串,並將二者進行比較。
String sa = new String("hello world");
String sb = new String("hello world");
System.out.println(sa==sb);
得到的結果為flase。
我們換一種方式,直接定義兩個相同的字串,再將二者進行比較。
String sc = "hello world";
String sd = "hello world";
System.out.println(sc==sd);
得到的結果為true。
到底是什麼原因,導致了兩種完全不同的比較結果呢?這涉及到了面向物件的問題,需要從記憶體的角度進行分析,這裡先不進行描述,大致瞭解即可。
四、布林值
我們知道,boolean資料型別的值只有兩種,true和false。有時我們設定了boolean值之後,需要用if語句進行判斷,if語句的寫法有以下兩種:
boolean flag = true;
if (flag){} //一般採用這種寫法
if (flag==true){}
這兩種寫法的含義是一樣的。而我們的程式碼要儘量做到精簡易讀,因此我們一般採用第一種寫法。