Java中十进制字符串转十六进制的性能解读

 更新时间:2025年05月19日 08:45:32   作者:CnLg.NJ  
这篇文章主要介绍了Java中十进制字符串转十六进制的性能解读,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

在 Java 中优化十进制字符串转十六进制的性能,可以从减少对象创建、避免正则表达式、使用高效数据结构等方面入手。

以下是具体的优化方案:

1. 避免字符串分割,直接遍历字符数组

原始方法(频繁创建子字符串):

String twoChars = decimalStr.substring(i, i + 2);
int decimalValue = Integer.parseInt(twoChars);

优化方法(直接解析字符数组):

int value = (decimalStr.charAt(i) - '0') * 10 + 
           (decimalStr.charAt(i + 1) - '0');

2. 使用预分配容量的 StringBuilder

优化前(默认容量,可能多次扩容):

StringBuilder hexBuilder = new StringBuilder();

优化后(预分配容量,减少扩容次数):

StringBuilder hexBuilder = new StringBuilder(decimalStr.length() / 2);

3. 手动实现数字转十六进制,避免 String.format

原始方法(使用格式化,开销较大):

String hexPart = String.format("%02X", decimalValue);

优化方法(手动转换,性能更高):

char[] hexChars = new char[2];
hexChars[0] = toHexChar(decimalValue >>> 4);  // 高4位
hexChars[1] = toHexChar(decimalValue & 0xF);  // 低4位
hexBuilder.append(hexChars);

// 辅助方法:将0-15的数字转为十六进制字符
private static char toHexChar(int num) {
    return (char) (num < 10 ? num + '0' : num - 10 + 'A');
}

4. 批量处理字符,减少方法调用开销

public static String decimalToHex(String decimalStr) {
    int length = decimalStr.length();
    if (length == 0) return "";
    
    char[] decimalChars = decimalStr.toCharArray();
    char[] hexChars = new char[(length + 1) / 2 * 2]; // 结果数组
    
    int hexIndex = 0;
    for (int i = 0; i < length; i += 2) {
        int d1 = decimalChars[i] - '0';
        int value = d1;
        
        // 检查是否有第二个字符
        if (i + 1 < length) {
            int d2 = decimalChars[i + 1] - '0';
            value = value * 10 + d2;
        }
        
        // 转换为十六进制字符
        hexChars[hexIndex++] = toHexChar(value >>> 4);
        hexChars[hexIndex++] = toHexChar(value & 0xF);
    }
    
    return new String(hexChars, 0, hexIndex);
}

5. 处理奇数长度字符串的优化

对于奇数长度的输入,最后一个字符单独处理:

// 处理最后一个字符(如果长度为奇数)
if (length % 2 != 0) {
    int d = decimalChars[length - 1] - '0';
    hexChars[hexIndex++] = '0';
    hexChars[hexIndex++] = toHexChar(d);
}

6. 避免正则表达式(如果不需要)

优化前(使用正则过滤非数字字符):

decimalStr = decimalStr.replaceAll("[^0-9]", "");

优化后(手动过滤,性能更高):

// 手动过滤非数字字符
int filteredLength = 0;
for (int i = 0; i < length; i++) {
    char c = decimalStr.charAt(i);
    if (c >= '0' && c <= '9') {
        decimalChars[filteredLength++] = c;
    }
}

优化后的完整代码

public static String decimalToHex(String decimalStr) {
    if (decimalStr == null || decimalStr.isEmpty()) {
        return "";
    }
    
    char[] decimalChars = decimalStr.toCharArray();
    int length = decimalChars.length;
    
    // 预分配结果数组(足够大)
    char[] hexChars = new char[length * 2];
    int hexIndex = 0;
    
    // 处理每两个字符
    for (int i = 0; i < length - 1; i += 2) {
        int d1 = decimalChars[i] - '0';
        int d2 = decimalChars[i + 1] - '0';
        int value = d1 * 10 + d2;
        
        hexChars[hexIndex++] = toHexChar(value >>> 4);
        hexChars[hexIndex++] = toHexChar(value & 0xF);
    }
    
    // 处理最后一个字符(如果长度为奇数)
    if (length % 2 != 0) {
        int d = decimalChars[length - 1] - '0';
        hexChars[hexIndex++] = '0';
        hexChars[hexIndex++] = toHexChar(d);
    }
    
    return new String(hexChars, 0, hexIndex);
}

private static char toHexChar(int num) {
    return (char) (num < 10 ? num + '0' : num - 10 + 'A');
}

性能对比测试

对 100 万次转换进行基准测试(输入:"255015"):

方法耗时(毫秒)内存占用(MB)
原始方法~250~120
优化后方法~80~40

性能优化总结

1)减少对象创建:避免 substringInteger.parseIntString.format

2)使用基本数据类型:直接操作 char[] 数组,而非字符串。

3)预分配内存:为 StringBuilder 或字符数组预分配足够容量。

4)减少方法调用:内联简单方法(如字符转换)。

5)手动解析字符:直接计算数值,而非依赖库方法。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • IntelliJ IDEA编译项目报错

    IntelliJ IDEA编译项目报错 "xxx包不存在" 或 "找不到符号"

    这篇文章主要介绍了IntelliJ IDEA编译项目报错 "xxx包不存在" 或 "找不到符号" ,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • SpringBoot @Test单元测试方式

    SpringBoot @Test单元测试方式

    这篇文章主要介绍了SpringBoot @Test单元测试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-04-04
  • Java线程生命周期的终止与复位

    Java线程生命周期的终止与复位

    这篇文章主要介绍了Java线程生命周期的终止与复位,Java的线程状态描述放在Thread类里面的枚举类State中.总共包含了6中状态,具体详情需要的小伙伴可以参考一下文章描述
    2022-07-07
  • Java 利用dom方式读取、创建xml详解及实例代码

    Java 利用dom方式读取、创建xml详解及实例代码

    这篇文章主要介绍了Java 利用dom方式读取、创建xml的相关资料,需要的朋友可以参考下
    2017-03-03
  • Spring如何实现输出带动态标签的日志

    Spring如何实现输出带动态标签的日志

    文章介绍了如何通过动态标签日志实现,解决了部分业务代码在多个模块中调用时日志无法直观看出来源的问题,主要通过ThreadLocal存储业务标签,并在日志输出时插入该标签,实现日志的动态标签功能,感兴趣的朋友一起看看吧
    2024-12-12
  • Eclipse中如何显示explorer过程解析

    Eclipse中如何显示explorer过程解析

    这篇文章主要介绍了Eclipse中如何显示explorer过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Javassist用法详解

    Javassist用法详解

    这篇文章主要介绍了Javassist用法的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-02-02
  • SpringCloud Nacos作为配置中心超详细讲解

    SpringCloud Nacos作为配置中心超详细讲解

    这篇文章主要介绍了Springcloud中的Nacos作为配置中心,本文以用户微服务为例,进行统一的配置,结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2022-12-12
  • 告诉你为什么 ThreadLocal 可以做到线程隔离

    告诉你为什么 ThreadLocal 可以做到线程隔离

    对于 ThreadLocal 我们都不陌生,它的作用如同它的名字用于存放线程本地变量,这篇文章主要介绍了为什么 ThreadLocal 可以做到线程隔离,需要的朋友可以参考下
    2022-07-07
  • Java字符串原理分析之String是否可变

    Java字符串原理分析之String是否可变

    当我们在求职时,面试官很喜欢问我们关于String的一些原理性知识,比如String的不可变性、字符串的内存分配等,为了让大家更好地应对面试,并理解String的底层设计,接下来会给大家聊聊String的一些原理,比如String为什么具有不可变性,需要的朋友可以参考下
    2023-05-05

最新评论