1:java幾種基本數據類型大小
關鍵字 |
類型 |
位數 (8位一字節) |
取值範圍(表示範圍) |
byte |
整型 |
8 |
-2^7 ~ 2^7-1 |
short |
整型 |
16 |
-2^15 ~ 2^15-1 |
int |
整型 |
32 |
-2^31 ~ 2^31-1 |
long |
整型 |
64 |
-2^63 ~ 2^63-1 |
float |
浮點數 |
32 |
3.402823e+38 ~ 1.401298e-45 |
double |
浮點數 |
64 |
1.797693e+308~ 4.9000000e-324 |
char |
文本型 |
16 |
0 ~ 2^16-1 |
boolean |
布爾值 |
32/8 |
true/false |
boolean的佔用大小是多少,有以下說法java
- 1bit: boolean編譯後的是使用1和0儲存,理論上只需1bit便可儲存
- 1byte: 計算機處理數據的最小單位是1byte,用一字節的最低位存儲,其餘的用0填補。若是值是true則儲存二進制爲0000 0001,false則是0000 0000
- 4byte or 1btye: java虛擬機沒有對boolean類型的專用字節碼指令,表達式所操做的boolean在編譯以後是使用int數據類型來代替的,而boolean數組則會被編譯成byte數組
正解 在java裏的正確回答應該是boolean類型單獨使用是4個byte,在數組裏則是1個byte。可是虛擬機爲何不用byte或short代替boolean而是int,這樣不是更節省內存空間?由於int對於32位處理器,一次處理的數據是32位,CPU尋址也是32位的查找,具備高效儲存的特色(若是有更好的理解,你們共同交流下)編程
2:64位的JVM中,int類型長度是多少
32位;int是32位類型,不會隨着系統或者jvm的位數而改變數組
3:char類型變量能不能儲存一箇中文的漢字,爲何
中文unicode編碼方式每一個字符佔用兩個字節,char是16位類型,中文儲存須要兩個字節,所以能夠儲存中文字符。jvm
4:浮點數float和雙精度浮點數double表示法
浮點數的二進制表示法由三部分組成編碼
float、double二進制結構spa
類型 |
符號位 |
指數位(e) |
尾數位(m) |
float |
1 |
8 |
23 |
double |
1 |
11 |
52 |
5:基本類型對應的包裝類,區別
基本類型 |
包裝類 |
boolean |
Boolean |
short |
Short |
byte |
Byte |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
char |
Character |
- 對於萬物皆對象的java,爲何會存在基本類型?由於java產生對象,通常是需在堆建立維護,再經過棧的引用來使用,可是對於簡單的小的變量,須要在堆建立再使用太麻煩了
爲何會有包裝類
- 包裝類將基本類型包裝起來,使其具備對象的性質,能夠添加屬性和方法,豐富基本類型的操做
- 對於泛型編程,或使用collection集合,須要包裝類。由於ArrayList,HashMap的泛型沒法指定基本類型
- 區別,基本類型能夠直接聲明使用,包裝類須要在堆建立,再經過引用使用;基本類型默認初始值,int爲0,boolean則是true/false,且沒法賦值爲null;而包裝類默認初始值是null
- 須要注意的點:Byte、Int、Short、Long直接賦值(或使用valueOf)如Integer x = value(value 在-128 ~ 127)是直接引用常量池裏的對象,此時對象比較 == 和 equals 都爲true ;Character聲明值則在0~127 是引用常量池對象、
![](http://static.javashuo.com/static/loading.gif)
6:基本類型的自動轉換
自動轉換規則有以下幾個
- 布爾類型boolean不存在隱式轉換爲其餘類型(非自動封裝類型)
整數類型的自動提高
- byte -> (short/char) -> int -> long (自動提高鏈)
- 表示範圍低的數據類型可隱式自動提高爲表示範圍高的數據類型(byte b = 1; short s = b; );無編譯錯誤
- short 和 char 都是16位,可是不能隱式轉換
字符型數據向整型數據的自動轉換
- char是無符號類型,表示範圍在(0~2^16-1),可隱式轉爲int或long類型
整型、字符型數據均可向浮點型的自動轉換
- 由於浮點型能保存的有效數字是限制的,須要考慮轉換後的有效位問題
![](http://static.javashuo.com/static/loading.gif)
浮點型數據的自動提高
- float轉double存在精偏差問題,double若是強制轉float則存在精度丟失問題
![](http://static.javashuo.com/static/loading.gif)
7:short s1 = 1; s1 = s1 + 1;有錯嗎? short s1 = 1; s1 += 1;有錯嗎?
- s1 = s1+1 中的1默認類型是int,表達式中低範圍類型s1會默認轉爲int來相加,獲得int型的結果,最後int型的結果不能隱式轉爲short,編譯報錯
- s1 += 1; 存在隱含的強制轉化 s1 += 1 -> s1 = (short) s1+ 1; 編譯不會報錯
8:不一樣的基本類型強制轉換,可能會產生什麼問題
- 浮點型轉整型,精度丟失、數據溢出
- 取值範圍大的整型轉取值範圍小的整型,數據溢出,高位丟失
9:float f = 3.4; 是否正確?
在java裏,不加後綴修飾的浮點數默認是double類型。double類型不能隱式類型轉成float,編譯會報錯
10:表達式3*0.1 == 0.3 將會返回什麼?true仍是false?
浮點型存在精度問題,3*0.1獲得的double數據尾數位 和 0.3 尾數位是不同的 ,false
11:浮點數和BigDecimal
- 浮點類型使用二進制存儲,不管float(7),double(15),其有效位是有限制的,存在舍入偏差,精度容易缺失
- 十進制小數轉爲浮點數再計算,嚴重存在精度問題。那麼是否能夠把十進制小數擴大N倍化爲整數維度來計算,並保留其精度位數,這就是BigDecimal
- BigDecimal是基於BigInteger來處理計算,BigInteger內部有一個int[] mag,表示存放正數的原字節數組 BigInteger原理
構造BigDecimal時避免使用浮點類型構造,會出現精度問題。儘可能使用字符串來建立BigDecimal,或者使用valueOf方法
BigDecimal data= new BigDecimal(0.1);
System.out.println("data:" + data);
result:
data:0.1000000000000000055511151231257827021181583404541015625
- BigDecimal 進行除法運算不整除時出現無限循環小數,會拋出 ArithmeticException 異常,須要指定精度
- 指定精度位數,同時須要指定舍入模式
12:switch語句可否做用在 byte 類型變量上,可否做用在long類型變量上,可否做用在 String 類型變量上?
- switch(expr) expr 須要時int類型,而byte,char,short 會自動提高爲int,所以能夠做用在switch關鍵字。long,float,double不能自動轉爲int,編譯會報錯
String 也不能自動轉爲int,在1.7以前也是不能用在switch。可是1.7以後JDK支持String,經過String.hashCode返回一個int類型,並在case裏再次使用String.equals比較
//語法糖反編譯
switch(s.hashCode()){
default;
break;
case 3556498:
if(s.equals("test")){
.....
}
break;
}
13:可否在不進行強制轉換的狀況下將一個double值賦值給long類型的變量
不行,由於double取值範圍大於long類型。不強制轉換會編譯報錯。若是使用 += 操做符編譯不會報錯,可是存在隱含的強制轉換
關注公衆號,你們一塊兒交流
![](http://static.javashuo.com/static/loading.gif)
參考文章