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

