一、方法定义
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);