Java字符串转整数与拼接实战指南

 更新时间:2026年02月24日 10:15:36   作者:爱学习的小可爱卢  
本文总结了Java中字符串转整数和字符串相加的核心知识点,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

本文总结Java中字符串转整数和字符串相加的核心知识点:1. 字符串转整数:推荐使用Integer.parseInt()方法,需注意处理NumberFormatException异常,对带空格的字符串要先trim(),大数值可使用Long.parseLong()或BigInteger。2. 字符串相加:编译期常量可使用+运算符(会被优化),但循环中必须使用StringBuilder以避免性能问题(性能差距可达200倍),多线程场景用StringBuffer,分隔符连接推荐String.join()。3. 关键陷阱:包括字符串转数字时的空值处理、进制转换问题,以及字符串拼接的性能优化策略。

一、 字符串转整形数字

1.1 精简版(快速上手)

// 方式1:最常用(返回基本类型 int)
String str = "123";
int num = Integer.parseInt(str);  // 123
// 方式2:返回包装类(有缓存优化)
Integer numObj = Integer.valueOf(str);  // Integer 对象
// 异常处理(必加!)
try {
    int badNum = Integer.parseInt("abc");  // 抛出 NumberFormatException
} catch (NumberFormatException e) {
    System.out.println("不是有效数字");
}
// 进制转换(如十六进制)
int hex = Integer.parseInt("FF", 16);  // 255

1.2 详细版(机制与陷阱)

public class StringToIntDemo {
    public static void main(String[] args) {
        // ========== 1. 核心方法对比 ==========
        // 【parseInt】返回基本类型 int,适合计算
        // 内部逻辑:逐个字符解析,遇到非数字立即抛异常
        int a = Integer.parseInt("100");           // 十进制 100
        int b = Integer.parseInt("100", 8);        // 八进制 100 = 64(十进制)
        int c = Integer.parseInt("100", 16);       // 十六进制 100 = 256(十进制)
        // 【valueOf】返回 Integer 包装类,有缓存优化(-128~127)
        // 内部实际调用 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(#也是十六进制标记)
        int f = Integer.decode("010");     // 8(0开头识别为八进制)
        // ========== 2. 异常处理(生产环境必看) ==========
        String risky = " 123 ";  // 带空格
        try {
            // 【陷阱1】前后空格会导致解析失败
            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) {
            // 【最佳实践】记录日志并给出默认值或终止流程
            System.err.println("非法数字格式:" + ex.getMessage());
            int defaultVal = 0; 
        }
        // ========== 3. 大数与边界 ==========
        // 【陷阱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 关键陷阱总结表

输入字符串结果原因
"123"✅ 123标准十进制
" 123 "❌ 异常含空格,必须先 trim()
""❌ 异常空字符串无法解析
null❌ NPE非 NumberFormatException,需提前判空
"0xFF"❌ 异常parseInt 不认识前缀,用 decode 或指定 radix=16
"123.45"❌ 异常含小数点,应先用 Double.parseDouble 再转 int

二、 字符串相加

2.1 精简版(性能核心)

// 方式1:+ 运算符(编译期常量优化)
String s = "Hello" + " " + "World";  // 编译后直接为 "Hello World"
// 方式2:循环中禁用 +(会产生大量临时对象)
String result = "";
for (int i = 0; i < 100; i++) {
    result += i;  // 每次循环都创建新的 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 详细版(编译器优化与陷阱)

public class StringConcatDemo {
    public static void main(String[] args) {
        // ========== 1. 编译期优化(常量折叠) ==========
        // 【常量折叠】编译器在编译阶段直接计算出结果
        String a = "Hello" + " " + "World";  // 编译后:String a = "Hello World";
        // 【陷阱】变量参与时无法优化
        String b = "Hello";
        String c = b + " World";  // 编译后实际是:new StringBuilder().append(b).append(" World").toString()
        // ========== 2. 运行时拼接的本质(StringBuilder) ==========
        // 反编译后等价代码:
        // String temp = new StringBuilder().append(b).append(" World").toString();
        // ========== 3. 循环中的致命陷阱 ==========
        // 【低效代码】O(n²) 复杂度,创建 n 个 StringBuilder 和 n 个 String 对象
        String bad = "";
        for (int i = 0; i < 1000; i++) {
            bad += i;  // 每次循环:new StringBuilder -> append -> toString
        }
        // 【高效代码】O(n) 复杂度,只创建一个 StringBuilder
        StringBuilder good = new StringBuilder(1000);  // 预估容量,避免扩容
        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 自带方法,内部使用数组复制,比 + 快但不如 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,适合构造带前后缀的字符串(如 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")→ 直接用 +(编译器优化)
  • ├── 单线程运行时拼接
  • │   ├── 次数 < 5 → 用 +(可读性好,性能可接受)
  • │   └── 次数 ≥ 5 或循环中 → 用 StringBuilder
  • ├── 多线程共享变量拼接 → 用 StringBuffer(线程安全)
  • └── 需要分隔符连接多个字符串 → 用 String.join

💡 一句话总结

字符串转数字用parseInt要防NumberFormatException和空值;字符串相加在循环中必须用StringBuilder,否则性能灾难。常量折叠让"a"+"b"在编译期就变成"ab",但变量相加会在运行时走StringBuilder。

到此这篇关于Java字符串转整数与拼接实战指南的文章就介绍到这了,更多相关java字符串转整数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot实现JWT动态密钥轮换的示例详解

    SpringBoot实现JWT动态密钥轮换的示例详解

    这篇文章主要为大家详细介绍了SpringBoot实现JWT动态密钥轮换的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-10-10
  • Mybatis操作数据时出现:java.sql.SQLSyntaxErrorException: Unknown column 'XXX' in 'field list'的问题解决

    Mybatis操作数据时出现:java.sql.SQLSyntaxErrorException: Unknown c

    这篇文章主要介绍了Mybatis操作数据时出现:java.sql.SQLSyntaxErrorException: Unknown column 'XXX' in 'field list',需要的朋友可以参考下
    2023-04-04
  • java如何创建一个jdbc程序详解

    java如何创建一个jdbc程序详解

    使用Java程序来操作数据库,后者更加直接的话就是使用Java程序来发送SQL语句的技术称之为:JDBC。下面这篇文章主要给大家介绍了关于利用java如何创建一个jdbc程序的相关资料,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-11-11
  • Java如何实现封装和包

    Java如何实现封装和包

    文章主要介绍了Java中的封装、访问修饰符、封装的好处、封装的步骤、包的概念、导入包、自定义包、常用的包、static关键字及其用法、代码块、对象的打印等内容
    2026-01-01
  • 如何使用Idea中的 Deployment 实现打包自动部署

    如何使用Idea中的 Deployment 实现打包自动部署

    这篇文章主要介绍了使用Idea中的 Deployment 实现打包自动部署,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-08-08
  • Java随机数算法原理与实现方法实例详解

    Java随机数算法原理与实现方法实例详解

    这篇文章主要介绍了Java随机数算法原理与实现方法,简单分析了随机数算法的原理并结合具体实例形式给出了java编程计算随机数的具体操作技巧,需要的朋友可以参考下
    2017-09-09
  • Java连接redis及基本操作示例

    Java连接redis及基本操作示例

    这篇文章主要介绍了Java连接redis及基本操作,结合实例形式较为详细的分析了java针对redis数据库的基本连接、配置及操作相关实现技巧,需要的朋友可以参考下
    2019-04-04
  • 用JAVA 设计生成二维码详细教程

    用JAVA 设计生成二维码详细教程

    本文主要介绍用JAVA 设计生成二维码,这里一步一步详细介绍用 java 如何设计二维码,并附有代码示例以便参考,有需要的小伙伴可以参考下
    2016-08-08
  • hadoop之MapReduce框架原理

    hadoop之MapReduce框架原理

    这篇文章主要介绍了hadoop的MapReduce框架原理,MapReduce是分为两个阶段的,MapperTask阶段,和ReduceTask阶段。如果有感兴趣的小伙伴可以借鉴参考
    2023-03-03
  • Spring boot如何通过@Scheduled实现定时任务及多线程配置

    Spring boot如何通过@Scheduled实现定时任务及多线程配置

    这篇文章主要介绍了Spring boot如何通过@Scheduled实现定时任务及多线程配置,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12

最新评论