今天和大家聊一下最最最基礎的吧,雖然簡單,但坑無處不在,會則鞏固,不會牢記,面試不能慘死于這些最基礎的知識點上~
老面:什麼是基礎類型與引用類型?有什麼差別?
笑小楓:基礎類型隻表示簡單的字元或數字,引用類型可以是任何複雜的資料結構。
差別:
- 存儲方式不同,基本類型是存儲在棧記憶體;引用類型變量是存放在堆記憶體中,棧中存放的是變量存放的記憶體位址。
- 傳遞方式不同,基本變量類型是值傳遞;引用變量類型是引用傳遞。
老面: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占用的記憶體情況如下:
img
老面:i64位JVM中,int的長度是多少位?
笑小楓:Java中,int類型變量的長度是一個固定值,與平台無關,都是32位。意思就是說,在32位和64位的Java虛拟機中,int類型的長度是相同的。
老面:i怎麼将byte轉換為String?
笑小楓:可以使用String接收byte[]參數的構造器來進行轉換,需要注意的點是要使用的正确的編碼,否則會使用平台預設編碼,這個編碼可能跟原來的編碼相同,也可能不同。
image-20230306105100095
老面:i我們能将int強制轉換為byte類型的變量嗎?
笑小楓:是的,我們可以做強制轉換,但是Java中int是32位的,而byte是8位的,是以,如果強制轉化時,int類型的高24位将會被丢棄,byte類型的範圍是從-128到127。
image-20230306110501695
老面:ibyte類型127+1等于多少?
笑小楓:如果結果是byte類型,答案是:-128。
image-20230306101108268
如果結果轉為int類型,答案是:128。
image-20230306101347326
解析:
byte的範圍是-128~127。
位元組長度為8位,最左邊的是符号位,而127的二進制為01111111,是以執行+1操作時,01111111變為10000000。
大家知道,計算機中存儲負數,存的是補碼的興衰。左邊第一位為符号位。
那麼負數的補碼轉換成十進制如下:
一個數如果為正,則它的原碼、反碼、補碼相同;一個正數的補碼,将其轉化為十進制,可以直接轉換。
已知一個負數的補碼,将其轉換為十進制數,步驟如下:
- 先對各位取反;
- 将其轉換為十進制數;
- 加上負号,再減去1;
例如10000000,最高位是1,是負數,對各位取反得01111111,轉換為十進制就是127,加上負号得-127,再減去1得-128;
老面:ifloat 和 double 的差別是什麼?
笑小楓:
- 記憶體中占有的位元組數不同
單精度浮點數在記憶體中占有4個位元組;
雙精度浮點數在記憶體中占有8個位元組;
- 有效數字位數不同
單精度浮點數有效數字8位;
雙精度浮點數有效數字16位;
- 數值取值範圍不同
單精度浮點數的表示範圍:-3.40E+38~3.40E+38
雙精度浮點數的表示範圍:-1.79E+308~-1.79E+308
- 在程式中處理速度不同
一般來說,CPU處理單精度浮點數的速度比雙精度浮點數的速度快
如果不聲明,預設小數是double類型,如果想用float,要進行強轉;
老面:i能在不進行強制轉換的情況下将double值指派給long類型的變量嗎?
笑小楓:不行,不能在沒有強制類型轉換的前提下将一個double值指派給long類型的變量,因為double類型的範圍比long類型更廣,是以必須要進行強制轉換。
老面:i3*0.1==0.3将會傳回什麼?
笑小楓:傳回false,因為浮點數不能完全精确的表示出來,一般會損失精度。
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);其中有隐含的強制類型轉換。
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,大于