当前位置: 首页 > article >正文

如何优化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.parseInt 和 String.format

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

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

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

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

http://www.lryc.cn/news/2378720.html

相关文章:

  • CycleISP: Real Image Restoration via Improved Data Synthesis通过改进数据合成实现真实图像恢复
  • Day28 Python打卡训练营
  • 【OpenCV】基本数据类型及常见图像模式
  • Linux之Nginx安装及配置原理篇(一)
  • 【Linux网络】NAT和代理服务
  • 中药药效成分群的合成生物学研究进展-文献精读130
  • 【消息队列】RabbitMQ基本认识
  • OCCT知识笔记之OCAF框架详解
  • 蓝桥杯 16. 外卖店优先级
  • 1T 服务器租用价格解析
  • 【JavaWeb】Maven(下)
  • java.lang.ArithmeticException
  • openEuler24.03 LTS下安装MySQL8.0.42
  • gflags 安装及使用
  • Linux面试题集合(2)
  • 致敬经典 << KR C >> 之打印输入单词水平直方图和以每行一个单词打印输入 (练习1-12和练习1-13)
  • std::ratio<1,1000> 是什么意思?
  • 基于Llama3的开发应用(二):大语言模型的工业部署
  • 2025.05.17淘天机考笔试真题第三题
  • windows 10 做服务器 其他电脑无法访问,怎么回事?
  • Linux进程信号处理(26)
  • 【从设置到上传的全过程】本地多个hexo博客,怎么设置ssh才不会互相影响
  • 顶层架构 - 消息集群推送方案
  • Python训练打卡Day26
  • 构建优雅对象的艺术:Java 建造者模式的架构解析与工程实践
  • 报表控件stimulsoft教程:如何在报表和仪表板中创建热图
  • (8)python开发经验
  • 0x08.Redis 支持事务吗?如何实现?
  • win32相关(字符编码)
  • 使用Langfuse和RAGAS,搭建高可靠RAG应用