Java面試題之基本數據類型

聲明

題目來源於【每日一題】Java 基本數據類型基礎面試題

本文目的在於寫下自己的理解和補充,若沒有更好的理解會寫明原答案,歡迎大家補充和指正

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數組和Stringand StringBuffer類中使用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; 纔可以。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章