Java面試高頻總結:基本數據類型深度解析
📊 八種基本數據類型詳解
數據類型 | 關鍵字 | 字節數 | 位數 | 默認值 | 取值范圍 | 核心特性 |
---|---|---|---|---|---|---|
字節型 | byte | 1 | 8 | 0 | -128 ~ 127 | 最小整數類型 |
短整型 | short | 2 | 16 | 0 | -32,768 ~ 32,767 | 較少使用 |
整型 | int | 4 | 32 | 0 | -231 ~ 231-1 (約±21億) | 最常用整數類型 |
長整型 | long | 8 | 64 | 0L | -2?3 ~ 2?3-1 | 大范圍整數 |
單精度 | float | 4 | 32 | 0.0f | ±3.4e-38 ~ ±3.4e38 | 需后綴f/F |
雙精度 | double | 8 | 64 | 0.0d | ±1.7e-308 ~ ±1.7e308 | 默認浮點類型 |
字符型 | char | 2 | 16 | ‘\u0000’ | 0 ~ 65,535 (Unicode字符) | 存儲單個字符 |
布爾型 | boolean | - | 1 | false | true/false | 條件判斷專用 |
💡 關鍵記憶點:
int
和long
的區別不僅是范圍大小,更在內存占用和處理效率上- 浮點類型默認是
double
,聲明float
必須顯式添加f
后綴boolean
大小未精確定義,JVM實現通常使用1字節
🔄 數據類型轉換與運算
類型轉換三要素
-
隱式轉換(自動提升)
- 小范圍類型→大范圍類型自動轉換
- 方向:
byte → short → int → long → float → double
char
→int
自動轉換(獲取Unicode值)
-
顯式轉換(強制類型轉換)
- 語法:
(目標類型)變量名
- 風險:精度丟失(浮點→整數)或數據溢出(大整數→小整數)
- 示例:
double d = 3.14; int i = (int)d; // i=3
- 語法:
-
字符串轉換橋梁
- 基本類型→String:
String.valueOf()
或"" + 基本類型
- String→基本類型:
Integer.parseInt()
等包裝類方法
- 基本類型→String:
?? long與int互轉注意事項
轉換方向 | 方式 | 風險等級 | 推薦做法 |
---|---|---|---|
int → long | 隱式自動 | ★☆☆☆☆ | 直接賦值即可 |
long → int | 強制顯式 | ★★★★☆ | 必須檢查范圍:if(longVal >= Integer.MIN_VALUE && longVal <= Integer.MAX_VALUE) |
💰 BigDecimal vs double:金融計算的生死抉擇
為什么double不適合金融計算?
// 典型精度丟失案例
System.out.println(0.1 + 0.2);
// 輸出:0.30000000000000004 (而非0.3)
BigDecimal核心優勢
維度 | double | BigDecimal |
---|---|---|
精度 | 15-17位有效數字 | 任意精度 |
計算原理 | 二進制浮點近似值 | 十進制精確計算 |
舍入控制 | 基本四舍五入 | 8種舍入模式 |
適用場景 | 科學計算、3D圖形 | 財務系統、貨幣 |
性能 | 快 | 慢(約10-100倍) |
🔥 黃金法則:凡是涉及貨幣金額、稅率計算、利息結算等場景,必須使用BigDecimal!
📦 裝箱與拆箱機制揭秘
核心概念
自動裝箱/拆箱原理
- 裝箱:
Integer i = 100;
→ 編譯為Integer.valueOf(100)
- 拆箱:
int j = i;
→ 編譯為i.intValue()
使用陷阱
Integer a = 100;
Integer b = 100;
Integer c = 200;
Integer d = 200;System.out.println(a == b); // true(緩存范圍-128~127)
System.out.println(c == d); // false(超出緩存,新建對象)
? int vs Integer:原始與包裝的博弈
存在意義對比
維度 | int(基本類型) | Integer(包裝類) |
---|---|---|
內存占用 | 4字節 | 16字節(對象頭+字段) |
存儲位置 | 棧內存 | 堆內存 |
功能擴展 | 僅數值運算 | 提供類型轉換、解析等方法 |
集合兼容 | 不可直接使用 | 可直接存入集合 |
泛型支持 | 不可用于泛型 | 可用于泛型 |
空值表示 | 無(0有歧義) | 可用null表示缺失值 |
使用場景決策樹
graph TD
A[需要存儲數據] --> B{是否使用集合/泛型?}
B -->|是| C[使用Integer]
B -->|否| D{是否高頻計算?}
D -->|是| E[使用int]
D -->|否| F{需要空值語義?}
F -->|是| C
F -->|否| E
🎯 Integer緩存機制深度解析
緩存范圍與原理
- 默認范圍:-128 ~ 127(可通過JVM參數
-XX:AutoBoxCacheMax=<size>
擴展上限) - 實現原理:
Integer.valueOf()
優先返回緩存對象 - 源碼關鍵:
public static Integer valueOf(int i) {if (i >= IntegerCache.low && i <= IntegerCache.high)return IntegerCache.cache[i + (-IntegerCache.low)];return new Integer(i); }
緩存機制影響
場景 | 結果 | 原因分析 |
---|---|---|
Integer a = 127; Integer b = 127; | a == b | 命中緩存,同一對象 |
Integer c = 128; Integer d = 128; | c != d | 超出范圍,新建不同對象 |
Integer e = new Integer(100); Integer f = new Integer(100); | e != f | 強制新建對象 |
?? 重要建議:Integer比較始終使用
equals()
而非==
!
💎 核心知識總結
-
基本類型選擇鐵律:
- 整數默認用
int
,超20億用long
- 浮點默認用
double
,精確計算用BigDecimal
- 整數默認用
-
類型轉換三原則:
- 小轉大自動,大轉小強制
- 浮點轉整數截斷小數
- 字符串轉換注意格式異常
-
包裝類使用精髓:
- 集合存儲必須用包裝類
- 高頻計算場景用基本類型
- 對象比較用
equals()
-
Integer緩存陷阱:
- 默認緩存-128~127
- 值比較用
equals()
- 避免用
new Integer()
創建對象