一、方法定义
public static String toHexString(long i)
- 所属类:
java.lang.Long
- 访问修饰符:
public static
- 参数:
long i —— 需要转换的长整型数值
- 返回值:返回一个表示该
long 值的无符号十六进制(hexadecimal)字符串,不包含前缀 0x
- 异常:无
二、功能说明
将一个 long 类型的整数转换为对应的无符号十六进制字符串表示。
- 转换基于无符号整数逻辑,即负数也会被正确转换为其二进制补码对应的十六进制表示。
- 输出字符串小写(a-f),且不带
0x 前缀。
- 适用于调试、位操作、内存地址表示、哈希值输出等场景。
三、示例代码
1. 基本用法
public class LongToHexStringExample {
public static void main(String[] args) {
long value1 = 255;
long value2 = -1;
long value3 = 0;
long value4 = 256;
System.out.println(Long.toHexString(value1)); // 输出: ff
System.out.println(Long.toHexString(value2)); // 输出: ffffffffffffffff
System.out.println(Long.toHexString(value3)); // 输出: 0
System.out.println(Long.toHexString(value4)); // 输出: 100
}
}
2. 保留前导零(补全8位或16位)
// 补全为16位(64位long最大为16个十六进制字符)
long value = 255;
String hex = Long.toHexString(value);
String padded = String.format("%16s", hex).replace(' ', '0');
System.out.println(padded); // 输出: 00000000000000ff
3. 添加 0x 前缀
long value = 1000;
String hexWithPrefix = "0x" + Long.toHexString(value);
System.out.println(hexWithPrefix); // 输出: 0x3e8
4. 转换为大写
long value = 255;
String hexUpper = Long.toHexString(value).toUpperCase();
System.out.println(hexUpper); // 输出: FF
四、使用技巧
| 技巧 |
说明 |
| ✅ 格式化输出 |
使用 String.format("%016x", value) 直接补全16位并转小写 |
| ✅ 大写输出 |
.toUpperCase() 转大写,适合标准协议或日志 |
| ✅ 加前缀 |
拼接 "0x" 提高可读性,如 "0x" + Long.toHexString(value) |
| ✅ 与位运算结合 |
在调试位掩码、标志位时非常有用 |
| ✅ 哈希/唯一ID输出 |
如生成ID后转16进制便于查看 |
// 一行完成:带0x前缀、补全16位、大写
String result = String.format("0x%016X", value);
五、常见错误
| 错误 |
原因 |
修复方式 |
| ❌ 误认为负数会报错 |
toHexString 支持负数(按无符号处理) |
正常使用即可,理解补码机制 |
❌ 期望带 0x 前缀 |
该方法不包含前缀 |
手动拼接 "0x" |
| ❌ 忽略大小写 |
默认输出小写 a-f |
使用 .toUpperCase() |
❌ 误用 Integer.toHexString() 处理 long |
类型不匹配或精度丢失 |
确保使用 Long.toHexString() |
| ❌ 补零方式错误 |
直接截断或错误填充 |
使用 String.format("%016x", ...) |
六、注意事项
- 无符号转换:即使是负数,也会被转换为64位补码对应的十六进制值。
- 例如:
-1L → ffffffffffffffff
- 无前缀:输出不包含
0x,需手动添加。
- 小写字母:a-f 为小写,如需大写请调用
toUpperCase()。
- 无前导零:最小表示,不会自动补零(如
255 → ff,不是 00ff)。
- 线程安全:静态方法,无状态,线程安全。
七、最佳实践
| 实践 |
推荐做法 |
| 🔹 统一格式输出 |
定义工具方法返回固定格式(如 0x%016X) |
| 🔹 日志/调试使用 |
输出内存地址、哈希码、标志位时使用 |
| 🔹 避免重复创建字符串 |
若频繁调用,考虑缓存或使用 StringBuilder 拼接 |
| 🔹 命名清晰 |
变量名体现是 hex 字符串,如 hexId, addrHex |
| 🔹 封装常用格式 |
封装为工具类方法 |
public class HexUtils {
public static String toHex(long value) {
return String.format("0x%016X", value);
}
public static String toHexNoPrefix(long value) {
return String.format("%016x", value);
}
}
八、性能优化建议
| 场景 |
优化策略 |
| ⚡ 高频调用 |
避免重复 String.format,可缓存常用值或使用 StringBuilder 手动拼接 |
| ⚡ 大量数据转换 |
考虑使用 char[] 手动实现转换(极端优化,一般无需) |
| ⚡ 多字段拼接 |
使用 StringBuilder 避免字符串拼接性能损耗 |
// 高性能拼接多个 hex 值
StringBuilder sb = new StringBuilder();
sb.append(Long.toHexString(a)).append(':')
.append(Long.toHexString(b)).append(':')
.append(Long.toHexString(c));
⚠️ 通常情况下,Long.toHexString() 性能足够好,JVM 已优化,无需过早优化。
九、与其他方法对比
| 方法 |
说明 |
Integer.toHexString(int) |
用于 int 类型,32位 |
Long.toOctalString() |
转八进制 |
Long.toBinaryString() |
转二进制,适合位调试 |
String.format("%x", value) |
格式化方式,支持补零、前缀等 |
✅ 推荐:String.format("%x", value) 更灵活,适合格式化输出。
十、总结
| 项目 |
内容 |
| ✅ 核心功能 |
将 long 转为无符号十六进制字符串(小写,无前缀) |
| ✅ 关键特性 |
支持负数、无符号、64位完整输出 |
| ✅ 典型用途 |
调试、位运算、ID/哈希显示、内存地址表示 |
| ✅ 使用要点 |
记得加 0x、补零用 String.format、转大写用 toUpperCase() |
| ✅ 最佳实践 |
封装工具方法、统一格式、日志中清晰输出 |
| ✅ 避坑指南 |
不会报错负数、无前缀、无自动补零 |
💡 一句话掌握:
Long.toHexString(long) 是将 long 转为小写无前缀十六进制字符串的便捷方法,适合调试与展示,结合 String.format 和 toUpperCase() 可实现灵活格式化。
🎯 推荐用法模板:
String hex = String.format("0x%016X", yourLongValue);