天天看點

【面試篇】Java資料類型,面試你踩過的坑還少嗎?趕緊收藏吧

作者:笑小楓

今天和大家聊一下最最最基礎的吧,雖然簡單,但坑無處不在,會則鞏固,不會牢記,面試不能慘死于這些最基礎的知識點上~

老面:什麼是基礎類型與引用類型?有什麼差別?

笑小楓:基礎類型隻表示簡單的字元或數字,引用類型可以是任何複雜的資料結構。

差別:

  1. 存儲方式不同,基本類型是存儲在棧記憶體;引用類型變量是存放在堆記憶體中,棧中存放的是變量存放的記憶體位址。
  2. 傳遞方式不同,基本變量類型是值傳遞;引用變量類型是引用傳遞。

老面:String是基礎的資料類型嗎?

笑小楓:不是,是引用類型。String資料存儲是private final char value[];是以String類是不可變的,對String類的任何改變,都是傳回一個新的String類對象。

老面:JAVA有幾種基礎資料類型?對應的包裝類是什麼?

笑小楓:八種

基本資料類型:int,double,long,float,short,byte,char,boolean

對應的封裝類型是:Integer,Double,Long,Float,Short,Byte,Character,Boolean

老面:什麼是自動裝箱與拆箱?

笑小楓:

裝箱:将基本類型用它們對應的引用類型包裝起來;

拆箱:将包裝類型轉換為基本資料類型。

老面:int和Integer哪個會占用更多的記憶體?

笑小楓:Integer對象會占用更多的記憶體。Integer是一個對象,需要存儲對象的資訊。但是int是一個原始類型的資料,是以占用的空間更少。

32 位機器下,Integer占用的記憶體情況如下:

【面試篇】Java資料類型,面試你踩過的坑還少嗎?趕緊收藏吧

img

老面:i64位JVM中,int的長度是多少位?

笑小楓:Java中,int類型變量的長度是一個固定值,與平台無關,都是32位。意思就是說,在32位和64位的Java虛拟機中,int類型的長度是相同的。

老面:i怎麼将byte轉換為String?

笑小楓:可以使用String接收byte[]參數的構造器來進行轉換,需要注意的點是要使用的正确的編碼,否則會使用平台預設編碼,這個編碼可能跟原來的編碼相同,也可能不同。

【面試篇】Java資料類型,面試你踩過的坑還少嗎?趕緊收藏吧

image-20230306105100095

老面:i我們能将int強制轉換為byte類型的變量嗎?

笑小楓:是的,我們可以做強制轉換,但是Java中int是32位的,而byte是8位的,是以,如果強制轉化時,int類型的高24位将會被丢棄,byte類型的範圍是從-128到127。

【面試篇】Java資料類型,面試你踩過的坑還少嗎?趕緊收藏吧

image-20230306110501695

老面:ibyte類型127+1等于多少?

笑小楓:如果結果是byte類型,答案是:-128。

【面試篇】Java資料類型,面試你踩過的坑還少嗎?趕緊收藏吧

image-20230306101108268

如果結果轉為int類型,答案是:128。

【面試篇】Java資料類型,面試你踩過的坑還少嗎?趕緊收藏吧

image-20230306101347326

解析:

byte的範圍是-128~127。

位元組長度為8位,最左邊的是符号位,而127的二進制為01111111,是以執行+1操作時,01111111變為10000000。

大家知道,計算機中存儲負數,存的是補碼的興衰。左邊第一位為符号位。

那麼負數的補碼轉換成十進制如下:

一個數如果為正,則它的原碼、反碼、補碼相同;一個正數的補碼,将其轉化為十進制,可以直接轉換。

已知一個負數的補碼,将其轉換為十進制數,步驟如下:

  1. 先對各位取反;
  2. 将其轉換為十進制數;
  3. 加上負号,再減去1;

例如10000000,最高位是1,是負數,對各位取反得01111111,轉換為十進制就是127,加上負号得-127,再減去1得-128;

老面:ifloat 和 double 的差別是什麼?

笑小楓:

  1. 記憶體中占有的位元組數不同

單精度浮點數在記憶體中占有4個位元組;

雙精度浮點數在記憶體中占有8個位元組;

  1. 有效數字位數不同

單精度浮點數有效數字8位;

雙精度浮點數有效數字16位;

  1. 數值取值範圍不同

單精度浮點數的表示範圍:-3.40E+38~3.40E+38

雙精度浮點數的表示範圍:-1.79E+308~-1.79E+308

  1. 在程式中處理速度不同

一般來說,CPU處理單精度浮點數的速度比雙精度浮點數的速度快

如果不聲明,預設小數是double類型,如果想用float,要進行強轉;

老面:i能在不進行強制轉換的情況下将double值指派給long類型的變量嗎?

笑小楓:不行,不能在沒有強制類型轉換的前提下将一個double值指派給long類型的變量,因為double類型的範圍比long類型更廣,是以必須要進行強制轉換。

老面:i3*0.1==0.3将會傳回什麼?

笑小楓:傳回false,因為浮點數不能完全精确的表示出來,一般會損失精度。

【面試篇】Java資料類型,面試你踩過的坑還少嗎?趕緊收藏吧

image-20230306102640075

老面:ifloat f = 3.4;是否正确?

笑小楓:不正确。3.4是雙精度數,将雙精度型(double)指派給浮點型(float)屬于下轉型(down-casting,也稱為窄化)會造成精度損失,是以需要強制類型轉換floatf=(float)3.4;或者寫成floatf=3.4F;。

老面:ishort s1 = 1; s1 = s1+1;有錯嗎?short s1=1; s1+=1;有錯嗎?

笑小楓:對于short s1=1; s1=s1+1;由于1是int類型,是以s1+1運算結果也是int型,需要強制轉換類型才能指派給short型;是以編譯會報錯。

而short s1=1; s1+=1;可以正确編譯,因為s1+=1;相當于s1=(short)(s1+1);其中有隐含的強制類型轉換。

【面試篇】Java資料類型,面試你踩過的坑還少嗎?趕緊收藏吧

image-20230306105518346

老面:你們項目中金額是使用的什麼類型?

笑小楓:Java代碼中使用java.math.BigDecimal;Mysql資料庫中使用decimal 。

因為float、double都是浮點數, 都有取值範圍, 都有精度範圍. 浮點數與通常使用的小數不同, 使用中, 往往難以确定。是以說,float和double都是不能用來表示精确的類型的;金額必須是完全精确的計算, 故不能使用double或者float, 而應該采java.math.BigDecimal。

老面:簡單說說BigDecimal的加減乘除操作吧

笑小楓:

  • 加法運算:add()
  • 減法運算:subtract()
  • 乘法運算:multiply()
  • 除法運算:divide()

老面:BigDecimal兩個資料之間怎麼比較?

Java中對BigDecimal比較大小一般用的是Bigdemical的compareTo方法

比較的結果 -1,表示小于 0,表示等于 1,大于

繼續閱讀