首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Java 資料類型轉換完全手冊:基本類型、包裝類與字串互轉詳解

     編輯:Java 綜合教學

Java 資料類型轉換完全手冊

類型轉換是 Java 程式設計中的基礎且高頻操作。本文系統整理基本類型、包裝類、字串之間的相互轉換方式,並分析各方法的效能差異與適用場景。

一、基本類型與字串互轉

1. 字串 → 基本類型(解析)

目標類型推薦方法備選方法異常處理
intInteger.parseInt(str)Integer.valueOf(str).intValue()NumberFormatException
longLong.parseLong(str)Long.valueOf(str).longValue()NumberFormatException
doubleDouble.parseDouble(str)Double.valueOf(str).doubleValue()NumberFormatException
floatFloat.parseFloat(str)Float.valueOf(str).floatValue()NumberFormatException
booleanBoolean.parseBoolean(str)Boolean.valueOf(str).booleanValue()不拋異常,非 true 皆 false
byteByte.parseByte(str)Byte.valueOf(str).byteValue()NumberFormatException
shortShort.parseShort(str)Short.valueOf(str).shortValue()NumberFormatException

進制轉換:Integer.parseInt("FF", 16) → 255(支援 2-36 進制)

2. 基本類型 → 字串(格式化)

來源類型方法一(推薦)方法二方法三
intString.valueOf(i)Integer.toString(i)"" + i
longString.valueOf(l)Long.toString(l)"" + l
doubleString.valueOf(d)Double.toString(d)"" + d
floatString.valueOf(f)Float.toString(f)"" + f
booleanString.valueOf(b)Boolean.toString(b)"" + b

效能建議:String.valueOf() 內部直接調用對應的 toString(),且能處理 null 物件(回傳 "null" 字串),是最安全通用的選擇。

二、包裝類與基本類型互轉(裝箱/拆箱)

1. 自動裝箱/拆箱(JDK 5+)

// 裝箱:基本類型 → 包裝類
Integer i = 100;           // 相當於 Integer.valueOf(100)
Double d = 3.14;           // 相當於 Double.valueOf(3.14)

// 拆箱:包裝類 → 基本類型
int val = i;               // 相當於 i.intValue()
double val2 = d;           // 相當於 d.doubleValue()

2. 手動裝箱/拆箱(理解底層)

// 手動裝箱
Integer i1 = Integer.valueOf(100);  // 使用快取池 [-128, 127]
Integer i2 = new Integer(100);      // 每次建立新物件(不推薦)

// 手動拆箱
int val = i1.intValue();

3. 整數快取機制陷阱

Integer a = 100;
Integer b = 100;
System.out.println(a == b);  // true(快取池內)

Integer c = 200;
Integer d = 200;
System.out.println(c == d);  // false(超出快取範圍,新建物件)

// 正確比較方式
System.out.println(c.equals(d));  // true

三、日期時間類型轉換(重點)

1. java.sql.Date ↔ String

// String → sql.Date(格式必須 yyyy-MM-dd)
java.sql.Date sqlDate = java.sql.Date.valueOf("2024-01-15");

// sql.Date → String
String dateStr = sqlDate.toString();  // "2024-01-15"

2. java.util.Date ↔ String(SimpleDateFormat,線程不安全)

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

// Date → String
String formatted = sdf.format(new Date());

// String → Date
Date parsed = sdf.parse("2024-01-15 14:30:00");

3. Java 8+ 新日期時間 API(推薦,線程安全)

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

// LocalDateTime → String
String formatted = LocalDateTime.now().format(formatter);

// String → LocalDateTime
LocalDateTime parsed = LocalDateTime.parse("2024-01-15 14:30:00", formatter);

// 互轉 java.util.Date
Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
LocalDateTime ldt = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime();

四、數值類型之間的轉換

1. 自動類型提升(隱式轉換)

byte → short → int → long → float → double

int i = 10;
double d = i;  // 自動提升為 10.0

// char 特殊規則
char c = 'A';
int charInt = c;  // 自動轉為 ASCII/Unicode 碼值 65

2. 強制類型轉換(顯式轉換,可能損失精度)

double d = 3.14159;
int i = (int) d;  // 3,截斷小數部分

long l = 10000000000L;
int overflow = (int) l;  // 溢位,結果不可預期

五、通用轉換工具類範例

public class TypeConverter {

    /** 安全轉換為 Integer,失敗回傳預設值 */
    public static Integer toInteger(Object obj, Integer defaultValue) {
        if (obj == null) return defaultValue;
        if (obj instanceof Integer) return (Integer) obj;
        if (obj instanceof Number) return ((Number) obj).intValue();
        try {
            return Integer.parseInt(obj.toString().trim());
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    /** 安全轉換為 Long */
    public static Long toLong(Object obj, Long defaultValue) {
        if (obj == null) return defaultValue;
        if (obj instanceof Long) return (Long) obj;
        if (obj instanceof Number) return ((Number) obj).longValue();
        try {
            return Long.parseLong(obj.toString().trim());
        } catch (NumberFormatException e) {
            return defaultValue;
        }
    }

    /** 格式化 Double 保留指定小數位 */
    public static String formatDouble(double value, int decimalPlaces) {
        return String.format("%." + decimalPlaces + "f", value);
    }
}

六、常見坑點總結

  • Integer 比較:務必使用 equals(),避免 == 比較物件參考
  • BigDecimal 建構:使用 BigDecimal.valueOf(double) 或字串建構子,避免 new BigDecimal(0.1) 精度問題
  • SimpleDateFormat 線程不安全:使用 ThreadLocal 或 Java 8+ DateTimeFormatter
  • 浮點數運算:金融計算必須使用 BigDecimal
  • null 值處理:String.valueOf(null) 回傳 "null" 字串,parseXxx(null) 拋 NPE

掌握類型轉換的核心在於理解:基本類型與包裝類的裝箱拆箱機制、字串解析的異常處理、日期時間 API 的演進,以及精度敏感場景下 BigDecimal 的正確使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved