聲明
本文目的在於寫下自己的理解和補充,若沒有更好的理解會寫明原答案,歡迎大家補充和指正
1.如下賦值語句有什麼問題嗎?
short i = 1;
i = i + 1;//1
short j = 1;
j += 1;//2
結果:1.編譯器提示錯誤 2.正常
分析:這道題首先需要明白在java規範中:高位轉低位需要顯式強制轉換 ,低位轉高位會隱式的進行轉換;byte short char 參與運算時,會先自動轉換爲int類型。
題目首先要在抓住賦值的操作,在1處[short]+[int]
會得到[int]
的結果,[short] = [int]
賦值過程中缺少顯式類型轉換,正確的寫法應該是i=(short) (i + 1);
。而2處,這是一種複合賦值操作,它會自動地將所執行計算的結果轉型爲其左側變量的類型,即j += 1
等價於j=(short) (j + 1)
,所以能夠正確執行。
需要注意的是,若賦值的數大於類型的範圍將會報錯,下面是幾種基本數據類型的大小範圍,當作複習下
名稱 | 範圍 | 字節大小 |
---|---|---|
byte | [-2^7 ,2^7-1] 即-128~127 | 1字節 |
short | [-2^15, 2^15-1] 即-32,768~32,767 | 2字節 |
int | [-2^31 ,2^31-1] 即-2,147,483,648~2,147,483,647 | 4字節 |
long | [-2^63, 2^63-1] | 8字節 |
char | 字符型 | 2字節 |
float | 單精度 [-3.403E38,3.403E38] | 4字節 |
double | 雙精度 [-1.798E308,1.798E308] | 8字節 |
boolean | true/false | 1字節 |
2.java 中 char 類型變量能不能儲存一箇中文的漢字,爲什麼?
對於這個問題,首先我們需要知道一個問題就是,unicode編碼僅僅只是規定了可以用0到100多萬的編號來表示文字,幾乎涵蓋世界上的所有自然語言,每個區間都代表一種語言,但是unicode編碼並未給出具體的映射關係,而使用UTF-8和UTF-16等UTF標準作爲這些數值和字符的映射關係的編碼方案。
在API文檔中可以看到,
-
合法代碼點( code point)範圍在 U+0000 to U+10FFFF , 這也就是Unicode標量值(Unicode scalar value).
-
其中U+0000 to U+FFFF 有時也被稱爲 Basic Multilingual Plane (BMP)
-
代碼點大於U + FFFF的字符稱爲補充字符
-
Java平臺在
char
數組和String
andStringBuffer
類中使用UTF-16表示形式,在此表示形式中,BMP表示爲一個char值,而補充字符表示爲一對char
值
結論:char字符存儲的是Unicode編碼的代碼點,而大部分中文的代碼點集中在[0x4E00, 0x9FBB]區間內,也就是在BMP的範圍內,所以可以使用一個char字符表示,但是若部分中文是在補充字符的區間內則需要一對char纔可以表示。
3.Java 的 Integer 和 int 有什麼區別?
- int是基本數據類型,存放在棧;而Integer是int的包裝類,通常實例化後存放在堆中;
- Integer變量必須實例化後才能使用;int變量不需要;
- Integer是對象的引用,指向實例化的Integer對象;int是直接存儲數據值 ;
- Integer的默認值是null;int的默認值是0;
- Integer 類內部提供了一些關於整數操作的方法;
- Integer提供了保存有[-128,127] Integer類型的cache數組,若創建這個區間數值的Ingeger對象,則會引用cache數組內的實例。(詳見Integer的內部類IntegerCache)
4.java 的 switch 語句能否作用在 byte 類型變量上,能否作用在 long 類型變量上,能否作用在 String 類型變量上
結論:現switch支持分支條件類型爲: char, byte, short, int, Character, Byte, Short, Integer, String, enum
- 在JAVA7之前,switch裏只能判斷Integer與enum,因爲如題1所說,低位轉高位會隱式的進行轉換,而高位轉低位需要顯式強制轉換,所以switch 語句能否作用在 byte 類型變量上,而不能作用在long類型
- 在JAVA7後,switch可以使用String作爲分支條件
5.能否在不進行強制轉換的情況下將一個 double 值賦值給 long 類型的變量
原答案:不行,我們不能在沒有強制類型轉換的前提下將一個 double 值賦值給 long 類型的變量,因爲 double 類型的範圍比 long 類型更廣,所以必須要進行強制轉換。
6.java 中 3*0.1 == 0.3 將會返回什麼?true 還是 false
結論:會返回false,因爲在JAVA中計算3*0.1會輸出0.30000000000000004 而非0.3,精度不同自然比較結果也不同。
該問題還可以是 4*0.1 == 0.4會返回的是什麼?結果爲true
至於爲什麼可以看看這篇文章:爲什麼java裏面3x0.1=0.30000000000000004,而4x0.1=0.4?
文章裏,@藍色和@羅智勇兩位答主把問題解釋得很清楚了
以後有時間,我再切合源碼把這個問題闡述一遍
7.java 中 float f = 3.4; 是否正確?
原答案:不正確,3.4 是雙精度數,將雙精度型(double)賦值給浮點型(float)屬於向下轉型(down-casting,也稱爲窄化)會造成精度損失,因此需要強制類型轉換 float f = (float)3.4; 或者寫成 float f = 3.4F; 纔可以。