本文章分為四個部分:
1、基本數據類型的介紹
2、類型轉換
3、裝箱和拆箱
4、有道練習
5、增:編碼的那點事兒
--------------------------------------基本數據類型的介紹--------------------------------------
Java有8種基本數據類型,其中有4種整型、2種浮點類型、1種用於表示Unicode編碼的字符單元的字符類型char和1種用於表示真值的boolean類型。
類型 |
boolean |
char |
byte |
short |
int |
long |
float |
double |
存儲需求(字節) |
1 |
2 |
1 |
2 |
4 |
8 |
4 |
8 |
1、boolean類型的取值范圍有兩個,true和false,用來判斷邏輯條件。
並且整型值和布爾值之間不能進行相互轉換。
2、char類型原本用於表示單個字符,不過現在有些Unicole字符可以用一個char值描述,另外一些Unicole字符可以用兩個char值。
char類型的字面量值要用單引號括起來。
而且Unicode轉義序列會在解析代碼之前得到處理。
3、整型用於表示沒有小數部分的數值,它允許是負數。
Java提供了4種整型:byte、short、int、long。
Java中是沒有任何無符號(unsigned)形式的int、short、long或者byte類型的。
而且如果要表示長整形數據(long),后者要加上后綴L或者l。如果要表示二進制數,則加上前綴0B或者0b;如果要表示八進制數,則加上前綴0;如果要表示十六進制數,則加上前綴0X或者0x。
注意,byte的取值范圍是:-128~127。
4、浮點類型用於表示有小數部分的數值。
在Java中有兩種浮點類型 。
double表示這種類型的數據精度是float類型的兩倍(雙精度),絕大部分應用程序都采用double類型。
float類型的數值有一個后綴F或者f,沒有后綴F的浮點數值默認為double類型。
可以用十六進制表示浮點數值。例如0.125=2-3可以表示為0x1.0p-3,在16進制表示法中,使用p表示指數,而不是e,而且尾數采用16進制,指數采用10進制。指數的基數是2,而不是10。
所有的浮點數值計算都遵循IEEE754規范,用於表示溢出和出錯情況的三個特殊的浮點數值:正無窮大、負無窮大和NaN。
如果在數值計算中不允許有任何舍入誤差,這個使用就應該使用BigDecimal類了。
--------------------------------------類型轉換--------------------------------------
類型轉換可分為兩種,一種是自動類型轉換、另一種是強制類型轉換。
自動類型轉換
自動類型轉換我們可以比擬為是“一人得道雞犬升天”。
假如我們在對兩個數值進行二元操作,假如a是short類型的數值,b是int類型的數值,那么在進行計算的時候,a就會被轉換為int類型,所以得到的結果也是int類型的數據。
sum = a+b;
所以我們可以知道,自動類型轉換的方向是從低到高的,類似於:
byte->short->int->long
char->int->long
float->double
在這里,可能會有一個疑問,為什么short和char要分開出來寫呢?它們不都是2個字節的嗎?
原因是,short類型是有帶符號的類型,也就是說它有一個符號位,但是char沒有符號位,也就是說char和short類型雖然所占的內存大小一樣,但是所表示的范圍是不一樣的(char的表示范圍是0~2^16 - 1 (0 to 65535),short的表示范圍是 -2^15 to 2^15 - 1 (−32,768 to 32,767))。
強制類型轉換
強制類型轉換就有點像是去菜市場菜販子會“抹零頭”那樣,在Java中允許進行可能會丟失一些信息的類型轉換,而這種情況就需要通過強制類型轉換來實現。
強制類型轉換的語法格式是在圓括號中給出想要轉換的目標類型,后面緊跟待轉換的變量名。如:
double d = 2.3333; int i = (int)d;
不過如果試圖將一個數值從一種類型強制轉換成另一種類型,而又超出了目標類型的表示范圍,結果就會截斷成一個完全不同的值。
像是不要轉成boolean類型或者是byte類型。
--------------------------------------裝箱和拆箱--------------------------------------
裝箱和拆箱
裝箱和拆箱是一對相對的概念。
裝箱就是指把基本類型用它們相應的引用類型包裝起來,使其具有對象的性質。
拆箱就是把引用類型的對象簡化成值類型的數據。
舉個栗子:
Integer i = 10; //裝箱
int n = i; //拆箱
用javap -v反編譯一下就知道這兩條語句對應的是不是裝箱和拆箱了。
然后我們分別看一下,Integer.valueOf方法和Integer.intValue方法的源碼:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); }
public int intValue() { return value; }
裝箱的這個過程是不是有點熟悉?詳情可以看一下我之前寫的這篇筆記:https://www.cnblogs.com/NYfor2018/p/9482390.html
而拆箱的過程是簡潔不加修飾,我們可以看到它的返回值直接就是int。
但,是不是那八種基本類型的裝箱過程都是相似的呢?不是的,但是它們是跟前面的八種基本數據類型的分類情況是類似的,也就是Integer、Short、Long、Byte的裝箱過程,Double和Float的裝箱過程、Boolean的裝箱過程和Character的裝箱過程的分別類似的。
下面祭上源碼:
public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; return new Integer(i); } public static Long valueOf(long l) { final int offset = 128; if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset]; } return new Long(l); } public static Short valueOf(short s) { final int offset = 128; int sAsInt = s; if (sAsInt >= -128 && sAsInt <= 127) { // must cache
return ShortCache.cache[sAsInt + offset]; } return new Short(s); } public static Byte valueOf(byte b) { final int offset = 128; return ByteCache.cache[(int)b + offset]; }
public static Double valueOf(double d) { return new Double(d); }
public static Float valueOf(float f) { return new Float(f); }
public static Boolean valueOf(boolean b) { return (b ? TRUE : FALSE); }
public static Character valueOf(char c) { if (c <= 127) { // must cache
return CharacterCache.cache[(int)c]; } return new Character(c); }
所以,在做有關於同種數據類型但是數值不一樣的面試題的時候,要對症下葯。
有關於基本數據類型的面試題可以看這篇文章,寫的很不錯:https://blog.csdn.net/u010539271/article/details/69668807
-------------------------------------有道面試題-------------------------------------
byte b1=1,b2=2,b3,b6; final byte b4=4,b5=6; b6=b4+b5; b3=(b1+b2);
System.out.println(b3+b6);
問題:這代碼片段編譯之后會出現什么情況?
答案:語句:b3=b1+b2編譯出錯
因為b4和b5已經聲明是一個final常量了,所以它在進行運算的時候不會因為要運算而自動轉化成int類型(int類型轉換成byte需要強制轉換,),因此會編譯錯誤。
但是因為b4和b5在進行運算的時候不會自動轉換成int類型,所以在進行b6=b4+b5語句的時候不會出現錯誤。
-------------------------------------編碼那點事兒-------------------------------------
值得回去再看看的文章:
https://www.cnblogs.com/lslk89/p/6898526.html
https://www.cnblogs.com/deepblue775737449/p/7604738.html
https://www.cnblogs.com/web21/p/6092414.html
https://blog.csdn.net/guxiaonuan/article/details/78678043
參考:
《Java核心技術I》
https://www.cnblogs.com/dolphin0520/p/3780005.html
https://blog.csdn.net/u010539271/article/details/69668807