一、方法定义

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", ...)

六、注意事项

  1. 无符号转换:即使是负数,也会被转换为64位补码对应的十六进制值。
    • 例如:-1Lffffffffffffffff
  2. 无前缀:输出不包含 0x,需手动添加。
  3. 小写字母:a-f 为小写,如需大写请调用 toUpperCase()
  4. 无前导零:最小表示,不会自动补零(如 255ff,不是 00ff)。
  5. 线程安全:静态方法,无状态,线程安全。

七、最佳实践

实践 推荐做法
🔹 统一格式输出 定义工具方法返回固定格式(如 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.formattoUpperCase() 可实现灵活格式化。

🎯 推荐用法模板

String hex = String.format("0x%016X", yourLongValue);