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字符串转整数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中redis增删查以及清理缓存的案例

    java中redis增删查以及清理缓存的案例

    这篇文章主要介绍了java中redis增删查以及清理缓存的案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • java使用缓冲流复制文件的方法

    java使用缓冲流复制文件的方法

    这篇文章主要为大家详细介绍了java使用缓冲流复制文件的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 如何实现Java的ArrayList经典实体类

    如何实现Java的ArrayList经典实体类

    ArrayList是Java集合框架中一个经典的实现类。他比起常用的数组而言,明显的优点在于,可以随意的添加和删除元素而不需考虑数组的大小。下面跟着小编一起来看下吧
    2017-02-02
  • MyBatis之自动映射与缓存问题及解析

    MyBatis之自动映射与缓存问题及解析

    文章主要介绍了MyBatis的配置与操作,包括自动映射(autoMappingBehavior)的设置(NONE、PARTIAL、FULL)、手动映射的步骤(使用<resultMap>标签)、SQL注入攻击的原理、缓存机制及其影响(一级缓存和二级缓存的作用、缓存失效的情况)
    2025-09-09
  • Java去掉小数点后面无效0的方案与建议

    Java去掉小数点后面无效0的方案与建议

    当前小数点后面的位数过多的时候,多余的0没有实际意义,下面这篇文章主要给大家介绍了关于Java去掉小数点后面无效0的方案与建议,文中通过示例代码介绍的非常详细,需要的朋友可以参考下
    2022-07-07
  • 使用FeignClient设置动态Url

    使用FeignClient设置动态Url

    这篇文章主要介绍了使用FeignClient设置动态Url方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • IDEA插件指南之Mybatis log插件安装及使用方法

    IDEA插件指南之Mybatis log插件安装及使用方法

    这篇文章主要给大家介绍了关于IDEA插件指南之Mybatis log插件安装及使用的相关资料,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-02-02
  • java中Lamda表达式讲解

    java中Lamda表达式讲解

    本文详细讲解了java中的Lamda表达式,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-12-12
  • SpringBoot详细探究讲解默认组件扫描

    SpringBoot详细探究讲解默认组件扫描

    在项目中我们创建了Controller,这个Controller是如何被spring自动加载的呢?为什么Controller必须放在启动类的同级目录下呢
    2022-06-06
  • MyBatis OGNL 表达式的避坑指南

    MyBatis OGNL 表达式的避坑指南

    本文主要介绍了MyBatis OGNL 表达式的避坑指南,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2025-09-09

最新评论