本文章分爲四個部分:html
一、基本數據類型的介紹java
二、類型轉換web
三、裝箱和拆箱面試
四、有道練習編碼
五、增:編碼的那點事兒spa
--------------------------------------基本數據類型的介紹--------------------------------------.net
Java有8種基本數據類型,其中有4種整型、2種浮點類型、1種用於表示Unicode編碼的字符單元的字符類型char和1種用於表示真值的boolean類型。code
類型htm |
boolean對象 |
char |
byte |
short |
int |
long |
float |
double |
存儲需求(字節) |
1 |
2 |
1 |
2 |
4 |
8 |
4 |
8 |
一、boolean類型的取值範圍有兩個,true和false,用來判斷邏輯條件。
而且整型值和布爾值之間不能進行相互轉換。
二、char類型本來用於表示單個字符,不過如今有些Unicole字符能夠用一個char值描述,另一些Unicole字符能夠用兩個char值。
char類型的字面量值要用單引號括起來。
並且Unicode轉義序列會在解析代碼以前獲得處理。
三、整型用於表示沒有小數部分的數值,它容許是負數。
Java提供了4種整型:byte、short、int、long。
Java中是沒有任何無符號(unsigned)形式的int、short、long或者byte類型的。
並且若是要表示長整形數據(long),後者要加上後綴L或者l。若是要表示二進制數,則加上前綴0B或者0b;若是要表示八進制數,則加上前綴0;若是要表示十六進制數,則加上前綴0X或者0x。
注意,byte的取值範圍是:-128~127。
四、浮點類型用於表示有小數部分的數值。
在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語句的時候不會出現錯誤。
-------------------------------------編碼那點事兒-------------------------------------
值得回去再看看的文章:
http://www.javashuo.com/article/p-vgcrleny-gd.html
http://www.javashuo.com/article/p-nzbbxosr-ex.html
http://www.javashuo.com/article/p-grzrtveo-er.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