Java字符串轉(zhuǎn)整數(shù)與拼接實戰(zhàn)指南
本文總結(jié)Java中字符串轉(zhuǎn)整數(shù)和字符串相加的核心知識點:1. 字符串轉(zhuǎn)整數(shù):推薦使用Integer.parseInt()方法,需注意處理NumberFormatException異常,對帶空格的字符串要先trim(),大數(shù)值可使用Long.parseLong()或BigInteger。2. 字符串相加:編譯期常量可使用+運算符(會被優(yōu)化),但循環(huán)中必須使用StringBuilder以避免性能問題(性能差距可達200倍),多線程場景用StringBuffer,分隔符連接推薦String.join()。3. 關(guān)鍵陷阱:包括字符串轉(zhuǎn)數(shù)字時的空值處理、進制轉(zhuǎn)換問題,以及字符串拼接的性能優(yōu)化策略。
一、 字符串轉(zhuǎn)整形數(shù)字
1.1 精簡版(快速上手)
// 方式1:最常用(返回基本類型 int)
String str = "123";
int num = Integer.parseInt(str); // 123
// 方式2:返回包裝類(有緩存優(yōu)化)
Integer numObj = Integer.valueOf(str); // Integer 對象
// 異常處理(必加?。?
try {
int badNum = Integer.parseInt("abc"); // 拋出 NumberFormatException
} catch (NumberFormatException e) {
System.out.println("不是有效數(shù)字");
}
// 進制轉(zhuǎn)換(如十六進制)
int hex = Integer.parseInt("FF", 16); // 2551.2 詳細版(機制與陷阱)
public class StringToIntDemo {
public static void main(String[] args) {
// ========== 1. 核心方法對比 ==========
// 【parseInt】返回基本類型 int,適合計算
// 內(nèi)部邏輯:逐個字符解析,遇到非數(shù)字立即拋異常
int a = Integer.parseInt("100"); // 十進制 100
int b = Integer.parseInt("100", 8); // 八進制 100 = 64(十進制)
int c = Integer.parseInt("100", 16); // 十六進制 100 = 256(十進制)
// 【valueOf】返回 Integer 包裝類,有緩存優(yōu)化(-128~127)
// 內(nèi)部實際調(diào)用 parseInt,但會走緩存池
Integer obj1 = Integer.valueOf("100");
Integer obj2 = Integer.valueOf("100");
System.out.println(obj1 == obj2); // true(緩存命中,同一對象)
// 【decode】支持 0x/0X/0/# 前綴自動識別進制
int d = Integer.decode("0xFF"); // 255(自動識別十六進制)
int e = Integer.decode("#FF"); // 255(#也是十六進制標(biāo)記)
int f = Integer.decode("010"); // 8(0開頭識別為八進制)
// ========== 2. 異常處理(生產(chǎn)環(huán)境必看) ==========
String risky = " 123 "; // 帶空格
try {
// 【陷阱1】前后空格會導(dǎo)致解析失敗
int fail = Integer.parseInt(risky); // NumberFormatException
// 【正確做法】先 trim
int success = Integer.parseInt(risky.trim()); // 123
// 【陷阱2】空字符串和 null
// Integer.parseInt(""); // NumberFormatException(空串)
// Integer.parseInt(null); // NullPointerException(注意:不是 NumberFormatException!)
} catch (NumberFormatException ex) {
// 【最佳實踐】記錄日志并給出默認(rèn)值或終止流程
System.err.println("非法數(shù)字格式:" + ex.getMessage());
int defaultVal = 0;
}
// ========== 3. 大數(shù)與邊界 ==========
// 【陷阱3】超出 int 范圍(-2147483648 ~ 2147483647)
// Integer.parseInt("2147483648"); // NumberFormatException(超出上限)
// 【解決方案】用 Long
long big = Long.parseLong("2147483648");
// 【解決方案】更大用 BigInteger(任意精度)
java.math.BigInteger huge = new java.math.BigInteger("99999999999999999999");
}
}1.3 關(guān)鍵陷阱總結(jié)表
| 輸入字符串 | 結(jié)果 | 原因 |
| "123" | ? 123 | 標(biāo)準(zhǔn)十進制 |
| " 123 " | ? 異常 | 含空格,必須先 trim() |
| "" | ? 異常 | 空字符串無法解析 |
| null | ? NPE | 非 NumberFormatException,需提前判空 |
| "0xFF" | ? 異常 | parseInt 不認(rèn)識前綴,用 decode 或指定 radix=16 |
| "123.45" | ? 異常 | 含小數(shù)點,應(yīng)先用 Double.parseDouble 再轉(zhuǎn) int |
二、 字符串相加
2.1 精簡版(性能核心)
// 方式1:+ 運算符(編譯期常量優(yōu)化)
String s = "Hello" + " " + "World"; // 編譯后直接為 "Hello World"
// 方式2:循環(huán)中禁用 +(會產(chǎn)生大量臨時對象)
String result = "";
for (int i = 0; i < 100; i++) {
result += i; // 每次循環(huán)都創(chuàng)建新的 StringBuilder 和 String 對象,極慢!
}
// 方式3:StringBuilder(單線程推薦)
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 100; i++) {
sb.append(i);
}
String result = sb.toString();
// 方式4:String.join(Java 8+,連接多個字符串)
String joined = String.join("-", "2024", "02", "23"); // "2024-02-23"2.2 詳細版(編譯器優(yōu)化與陷阱)
public class StringConcatDemo {
public static void main(String[] args) {
// ========== 1. 編譯期優(yōu)化(常量折疊) ==========
// 【常量折疊】編譯器在編譯階段直接計算出結(jié)果
String a = "Hello" + " " + "World"; // 編譯后:String a = "Hello World";
// 【陷阱】變量參與時無法優(yōu)化
String b = "Hello";
String c = b + " World"; // 編譯后實際是:new StringBuilder().append(b).append(" World").toString()
// ========== 2. 運行時拼接的本質(zhì)(StringBuilder) ==========
// 反編譯后等價代碼:
// String temp = new StringBuilder().append(b).append(" World").toString();
// ========== 3. 循環(huán)中的致命陷阱 ==========
// 【低效代碼】O(n2) 復(fù)雜度,創(chuàng)建 n 個 StringBuilder 和 n 個 String 對象
String bad = "";
for (int i = 0; i < 1000; i++) {
bad += i; // 每次循環(huán):new StringBuilder -> append -> toString
}
// 【高效代碼】O(n) 復(fù)雜度,只創(chuàng)建一個 StringBuilder
StringBuilder good = new StringBuilder(1000); // 預(yù)估容量,避免擴容
for (int i = 0; i < 1000; i++) {
good.append(i);
}
String result = good.toString();
// 【性能對比】10000次拼接:
// String+ 耗時:約 200-500ms
// StringBuilder 耗時:約 1-2ms (差距200倍以上!)
// ========== 4. 其他拼接方式 ==========
// 【concat】String 自帶方法,內(nèi)部使用數(shù)組復(fù)制,比 + 快但不如 StringBuilder
String s1 = "Hello".concat(" ").concat("World");
// 【join】Java 8 新增,適合用分隔符合并多個字符串
String[] parts = {"Java", "Python", "C++"};
String lang = String.join("、", parts); // "Java、Python、C++"
// 【formatted】Java 15+
String info = "姓名:%s,年齡:%d".formatted("張三", 20);
// 【StringJoiner】Java 8,適合構(gòu)造帶前后綴的字符串(如 SQL)
java.util.StringJoiner joiner = new java.util.StringJoiner(", ", "[", "]");
joiner.add("A").add("B").add("C");
System.out.println(joiner.toString()); // [A, B, C]
}
}2.3 性能選擇決策樹
- 需要拼接字符串?
- ├── 編譯期常量(如 "a" + "b")→ 直接用 +(編譯器優(yōu)化)
- ├── 單線程運行時拼接
- │ ├── 次數(shù) < 5 → 用 +(可讀性好,性能可接受)
- │ └── 次數(shù) ≥ 5 或循環(huán)中 → 用 StringBuilder
- ├── 多線程共享變量拼接 → 用 StringBuffer(線程安全)
- └── 需要分隔符連接多個字符串 → 用 String.join
?? 一句話總結(jié)
字符串轉(zhuǎn)數(shù)字用parseInt要防NumberFormatException和空值;字符串相加在循環(huán)中必須用StringBuilder,否則性能災(zāi)難。常量折疊讓"a"+"b"在編譯期就變成"ab",但變量相加會在運行時走StringBuilder。
到此這篇關(guān)于Java字符串轉(zhuǎn)整數(shù)與拼接實戰(zhàn)指南的文章就介紹到這了,更多相關(guān)java字符串轉(zhuǎn)整數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
SpringBoot實現(xiàn)JWT動態(tài)密鑰輪換的示例詳解
這篇文章主要為大家詳細介紹了SpringBoot實現(xiàn)JWT動態(tài)密鑰輪換的相關(guān)知識,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-10-10
Mybatis操作數(shù)據(jù)時出現(xiàn):java.sql.SQLSyntaxErrorException:?Unknown?c
這篇文章主要介紹了Mybatis操作數(shù)據(jù)時出現(xiàn):java.sql.SQLSyntaxErrorException:?Unknown?column?'XXX'?in?'field?list',需要的朋友可以參考下2023-04-04
如何使用Idea中的 Deployment 實現(xiàn)打包自動部署
這篇文章主要介紹了使用Idea中的 Deployment 實現(xiàn)打包自動部署,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2023-08-08
Java隨機數(shù)算法原理與實現(xiàn)方法實例詳解
這篇文章主要介紹了Java隨機數(shù)算法原理與實現(xiàn)方法,簡單分析了隨機數(shù)算法的原理并結(jié)合具體實例形式給出了java編程計算隨機數(shù)的具體操作技巧,需要的朋友可以參考下2017-09-09
Spring boot如何通過@Scheduled實現(xiàn)定時任務(wù)及多線程配置
這篇文章主要介紹了Spring boot如何通過@Scheduled實現(xiàn)定時任務(wù)及多線程配置,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12

