Java 基本類型是程序運行的基石,理解其內存佈局、取值範圍、默認值及包裝類關係,對編寫高性能、省內存代碼至關重要。本文系統梳理八大基本類型,並關聯 Hibernate 自動映射策略與常見坑點。
| 分類 | 關鍵字 | 位數 | 字節 | 默認值 | 取值範圍 | 包裝類 |
|---|---|---|---|---|---|---|
| 整型 | byte | 8 | 1 | 0 | -128 ~ 127 | Byte |
| short | 16 | 2 | 0 | -32,768 ~ 32,767 | Short | |
| int | 32 | 4 | 0 | -2^31 ~ 2^31-1 (~±21 億) | Integer | |
| long | 64 | 8 | 0L | -2^63 ~ 2^63-1 | Long | |
| 浮點型 | float | 32 | 4 | 0.0f | ~±3.4E38 (7 位有效數字) | Float |
| double | 64 | 8 | 0.0d | ~±1.7E308 (15-16 位有效數字) | Double | |
| 字符型 | char | 16 | 2 | '\u0000' | 0 ~ 65,535 (Unicode BMP) | Character |
| 布爾型 | boolean | ~1 (JVM 實現相關) | ~1 | false | true / false | Boolean |
L/l 標識 long:long id = 3000000000L;。byte b = 100;。BigDecimal,指定 scale 與 RoundingMode。3.14 默認 double,3.14f 為 float。Double/Float 提供 isNaN()、isInfinite() 判斷特殊值。'A' + 1 == 'B'。char[] (surrogate pair) 或 String (code point) 處理。boolean[] 1 byte/元素,BitSet 1 bit/元素)。true/false 以外的值,不可與 0/1 互轉。IntegerCache (-128~127)、ByteCache、ShortCache、LongCache、CharacterCache (0~127)、Boolean (單例 TRUE/FALSE)。Integer a = 100; Integer b = 100; a == b → true;超出範圍則 false。Integer obj = null; int val = obj; // NPE。集合泛型、三元運算符易隱性拆箱,需防御性非空判斷。Hibernate 根據字段長度/精度智能選擇列類型與包裝類,核心邏輯:
| Java 類型 | 推薦列類型 | Hibernate 默認映射 | 說明 |
|---|---|---|---|
| boolean | BIT / TINYINT(1) | NumericBooleanType (0/1) | 可配 @Type(type="yes_no") 存 Y/N |
| byte | TINYINT | ByteType | -128~127 |
| short | SMALLINT | ShortType | -32k~32k |
| int | INT | IntegerType | 最常用 |
| long | BIGINT | LongType | ID、時間戳首選 |
| float | FLOAT | FloatType | 7位精度 |
| double | DOUBLE | DoubleType | 15位精度 |
| BigDecimal | DECIMAL(p,s) | BigDecimalType | 金融/精度敏感必用,配合 @Column(precision=19, scale=4) |
| String | VARCHAR / TEXT | StringType | @Column(length=255) |
| char / Character | CHAR(1) | CharacterType | 單字符 |
| Date / LocalDate | DATE | DateType / LocalDateType | JDK 8+ 推薦 LocalDate |
| LocalDateTime | DATETIME / TIMESTAMP | LocalDateTimeType | 無時區 |
| byte[] | BLOB / VARBINARY | BinaryType / MaterializedBlobType | 大對象用 @Lob |
Hibernate 不會 在運行時動態變換包裝類類型。該描述實指:**DDL 生成階段**,根據實體字段聲明類型(或 @Column(columnDefinition))生成最匹配的列類型;**實體類字段建議聲明最窄合適類型**(如狀態碼用 Byte/Short、ID 用 Long),由開發者在建模階段決定,而非框架自動壓縮。
基本類型看似簡單,實則蘊含內存佈局、精度語義、緩存機制、ORM 映射等深層知識。牢記:金融用 BigDecimal、ID 用 Long、狀態碼用 Byte/Short、標識用 Boolean、文本用 String、二進制用 byte[]。建模階段選對類型,是系統穩定、高效、省資源的第一道防線。