Treasure Of JAVA——JAVA的資料型別(JAVA面試題)

Dog-Z發表於2020-09-24

Java 的資料型別

1.Java 的基本資料型別都有哪些各佔幾個位元組

類別八種位元組數資料表示範圍
整型byte1-128~127
整型short2-32768~32767
整型int4-2147483648~2147483647
整型long8-263~263 -1
浮點型float4-3.403E38~3.403E38
浮點型double8-1.798E308~1.798E308
字元型char2表示一個字元,如(‘a’,‘A’,‘0’,‘家’)
布林型boolean1只有兩個值 true 與 false

2. String 是基本資料型別嗎?

​ String 是引用型別,底層用 char 陣列實現的。

3. short 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);其中有隱含的強制型別轉換。

4. int 和 和 Integer 有什麼區別?

​ Java 是一個近乎純潔的物件導向程式語言,但是為了程式設計的方便還是引入了基本資料型別,為了能夠將這些基本

資料型別當成物件操作,Java 為每一個基本資料型別都引入了對應的包裝型別(wrapper class),int 的包裝類就是

Integer,從 Java 5 開始引入了自動裝箱/拆箱機制,使得二者可以相互轉換。

​ Java 為每個原始型別提供了包裝型別:

​ - 原始型別: boolean,char,byte,short,int,long,float,double

​ - 包裝型別:Boolean,Character,Byte,Short,Integer,Long,Float,Double

image-20200924150313600

5. 下面 Integer 型別的數值比較輸出的結果為?

image-20200924150344649

​ 如果不明就裡很容易認為兩個輸出要麼都是 true 要麼都是 false。首先需要注意的是 f1、f2、f3、f4 四個變數

都是 Integer 物件引用,所以下面的==運算比較的不是值而是引用。裝箱的本質是什麼呢?當我們給一個 Integer 對

象賦一個 int 值的時候,會呼叫 Integer 類的靜態方法 valueOf,如果看看 valueOf 的原始碼就知道發生了什麼。

​ 原始碼:

image-20200924150404404

IntegerCache 是 Integer 的內部類,其程式碼如下所示:

image-20200924150423082

image-20200924150435543

​ 簡單的說,如果整型字面量的值在-128 到 127 之間,那麼不會 new 新的 Integer 物件,而是直接引用常量池

中的 Integer 物件,所以上面的面試題中 f1f2 的結果是 true,而 f3f4 的結果是 false。

提醒:越是貌似簡單的面試題其中的玄機就越多,需要面試者有相當深厚的功力。

6. String 類常用方法

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-0DVPwsDm-1600931292543)(https://i.loli.net/2020/09/24/MbVIkxeFDC8wYGH.png)]

7. String、StringBuffer、StringBuilder 的區別?

(1)、可變不可變

​ String:字串常量,在修改時不會改變自身;若修改,等於重新生成新的字串物件。

​ StringBuffer:在修改時會改變物件自身,每次操作都是對 StringBuffer 物件本身進行修改,不是生成新的對

象;使用場景:對字串經常改變情況下,主要方法:append(),insert()等。

(2)、執行緒是否安全

​ String:物件定義後不可變,執行緒安全。

​ StringBuffer:是執行緒安全的(對呼叫方法加入同步鎖),執行效率較慢,適用於多執行緒下操作字串緩衝區

大量資料。

​ StringBuilder:是執行緒不安全的,適用於單執行緒下操作字串緩衝區大量資料。

(3)、共同點

​ StringBuilder 與 StringBuffer 有公共父類 AbstractStringBuilder(抽象類)。

​ StringBuilder、StringBuffer 的方法都會呼叫 AbstractStringBuilder 中的公共方法,如 super.append(…)。

只是 StringBuffer 會在方法上加 synchronized 關鍵字,進行同步。最後,如果程式不是多執行緒的,那麼使用

StringBuilder 效率高於 StringBuffer。

8. 資料型別之間的轉換

(1)、字串如何轉基本資料型別?

​ 呼叫基本資料型別對應的包裝類中的方法 parseXXX(String)或 valueOf(String)即可返回相應基本型別。

(2)、基本資料型別如何轉字串?

​ 一種方法是將基本資料型別與空字串(“”)連線(+)即可獲得其所對應的字串;另一種方法是呼叫 String

類中的 valueOf()方法返回相應字串。

相關文章