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

Java 常用類型轉換速查表:String ↔ int/Double/Long 互轉最佳實踐

     編輯:Java 相關知識

前言:類型轉換是每日必寫的基本功

在 Java 開發中,字串與基本數值類型 (int, long, double, float) 互轉是最高頻操作之一。雖然 API 簡單,但選擇錯誤方法可能導致效能損耗、空指針異常或進制解析錯誤。本文整理最標準、最高效的轉換寫法,並補充進制轉換、異常處理、效能對比等進階知識點。


一、String → 數值 (解析)

1. 推薦:Integer.parseInt(String) / Long.parseLong(String) / Double.parseDouble(String)

  • 返回 基本類型 (int, long, double),無自動拆箱開銷。
  • 直接拋出 NumberFormatException,語義清晰。
  • 支援指定基數 (radix):Integer.parseInt("FF", 16) → 255。
int age = Integer.parseInt("25"); long id = Long.parseLong("1008611"); double price = Double.parseDouble("99.9"); // 進制轉換 int hex = Integer.parseInt("FF", 16); // 255 int bin = Integer.parseInt("1010", 2); // 10

2. 替代:Integer.valueOf(String) → .intValue()

  • 返回 Integer 物件 (享有 -128~127 快取),再拆箱為 int。
  • 適用於「需要物件」或「想利用快取」的場景,單純解析基本類型略顯繁瑣。
int age = Integer.valueOf("25").intValue(); // 兩步驟,不如 parseInt 直接

⚠️ 陷阱提醒

  • null 輸入:兩者皆拋 NumberFormatException (非 NPE),建議先 if (str != null && !str.isEmpty()) 防禦。
  • 空白字符:" 123 " 會拋異常,需先 trim()。
  • 超出範圍:Integer.parseInt("3000000000") 拋異常,大數值改用 Long 或 BigInteger。

二、數值 → String (格式化)

1. 推薦:String.valueOf(基本類型)

  • 靜態多載完整支援所有基本類型 + 物件。
  • 底層呼叫 Integer.toString(i) 等,無額外開銷。
  • 語義清晰:「取得值的字串表示」。
String s1 = String.valueOf(123); // "123" String s2 = String.valueOf(45.67); // "45.67" String s3 = String.valueOf(true); // "true"

2. 替代:Integer.toString(int) / Long.toString(long)

  • 類別專屬靜態方法,效能相同,語義稍顯冗長。
  • 支援基數輸出:Integer.toString(255, 16) → "ff"。
String hex = Integer.toString(255, 16); // "ff" (小寫)

3. 簡寫但不推薦:"" + 數值

  • 編譯器會轉為 new StringBuilder().append(數值).toString(),建立額外物件。
  • 在循環/高頻路徑會產生大量臨時物件,增加 GC 壓力。
// 避免在熱點代碼使用 String s = "" + 123;

三、進階:格式化輸出與區域化

需求:千分位分隔、固定小數位、科學記號、貨幣符號 → 使用 String.format 或 DecimalFormat。

// String.format (JDK 1.5+) String price = String.format("%,.2f", 1234567.89); // "1,234,567.89" String pct = String.format("%.2f%%", 0.1234 * 100); // "12.34%" // DecimalFormat (更強大、可複用) DecimalFormat df = new DecimalFormat("#,##0.00"); String fmt = df.format(12345.6); // "12,345.60" // 區域化貨幣 NumberFormat currency = NumberFormat.getCurrencyInstance(Locale.TAIWAN); String twd = currency.format(12345); // "NT$12,345"

四、效能對比與最佳實踐總結表

場景最佳寫法避免寫法理由
String → intInteger.parseInt(s)new Integer(s) / Integer.valueOf(s).intValue()直接返回基本型,無物件分配
String → longLong.parseLong(s)同左同左
String → doubleDouble.parseDouble(s)同左同左
int → StringString.valueOf(i)"" + i無 StringBuilder 臨時物件
需指定進制Integer.toString(i, 16)手寫轉換邏輯標準庫優化、無 Bug
格式化輸出String.format / DecimalFormat手動拼接支援區域化、四捨五入、對齊

五、完整工具類範例 (可直接複製使用)

public final class ConvertUtils { private ConvertUtils() {} // String → int, 預設值 public static int toInt(String s, int defaultVal) { if (s == null || s.isEmpty()) return defaultVal; try { return Integer.parseInt(s.trim()); } catch (NumberFormatException e) { return defaultVal; } } // String → long public static long toLong(String s, long defaultVal) { if (s == null || s.isEmpty()) return defaultVal; try { return Long.parseLong(s.trim()); } catch (NumberFormatException e) { return defaultVal; } } // String → double public static double toDouble(String s, double defaultVal) { if (s == null || s.isEmpty()) return defaultVal; try { return Double.parseDouble(s.trim()); } catch (NumberFormatException e) { return defaultVal; } } // 數值 → 格式化字串 public static String formatNumber(Number num, String pattern) { if (num == null) return ""; return new DecimalFormat(pattern).format(num); } }

結語

掌握 parseXxx / valueOf / toString / String.format 的正確使用時機,能寫出更簡潔、高效、健壯的代碼。建議專案統一引入上述工具類,集中處理異常、預設值、格式化邏輯,避免分散在業務代碼中造成維護負擔。

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