在Java中,将long类型转换为String类型有多种方法,每种方法都有其适用场景和特点,下面我将详细介绍几种常用方法,并提供代码示例和性能分析。

哪种方法最好?
| 方法 | 优点 | 缺点 | 推荐场景 |
|---|---|---|---|
Long.toString(long) |
最高效、最标准 | 无 | 绝大多数情况下的首选 |
String.valueOf(long) |
同样高效,语义清晰 | 无 | 与其他类型转换风格统一时 |
"" + long |
书写最简单 | 性能开销大,可能产生临时对象 | 快速原型、代码极简主义 |
String.format() |
功能强大,可格式化 | 代码冗长,性能最差 | 需要特定格式(如补零、千分位) |
在日常开发中,请优先使用 Long.toString(long) 或 String.valueOf(long),它们性能最好,代码也清晰。
Long.toString(long) - 推荐
这是最直接、最高效的方法。Long类提供了一个静态的toString()方法,专门用于将long值转换为String。
特点:
- 性能最优:这是JDK内部实现的方法,经过高度优化,直接进行数值到字符串的转换,没有多余的步骤。
- 代码清晰:意图非常明确,就是进行类型转换。
代码示例:

public class LongToStringExample {
public static void main(String[] args) {
long number = 123456789L;
// 使用 Long.toString()
String str1 = Long.toString(number);
System.out.println("使用 Long.toString(): " + str1);
System.out.println("转换后的类型: " + str1.getClass().getName());
// 处理负数
long negativeNumber = -987654321L;
String str2 = Long.toString(negativeNumber);
System.out.println("使用 Long.toString() (负数): " + str2);
}
}
输出:
使用 Long.toString(): 123456789
转换后的类型: java.lang.String
使用 Long.toString() (负数): -987654321
String.valueOf(long) - 推荐
String类提供了一个静态的valueOf()方法重载,可以接受各种基本数据类型(包括long)并将其转换为String。
特点:
- 性能同样很高:底层通常也是调用
Long.toString(),所以性能与Long.toString()相当。 - 语义统一:当你需要将不同类型(如
int,double,long等)转换为String时,使用String.valueOf()可以使代码风格保持一致。
代码示例:

public class LongToStringExample {
public static void main(String[] args) {
long number = 123456789L;
// 使用 String.valueOf()
String str = String.valueOf(number);
System.out.println("使用 String.valueOf(): " + str);
System.out.println("转换后的类型: " + str.getClass().getName());
}
}
输出:
使用 String.valueOf(): 123456789
转换后的类型: java.lang.String
使用空字符串连接 "" + long
这是一种非常常见的简写方式,利用了Java的字符串连接特性。
特点:
- 书写简单:代码量最少。
- 性能较差:Java编译器在处理这种连接时,会先调用
String.valueOf()将long转换为String,然后再进行字符串连接,这涉及到创建一个临时的StringBuilder对象,并可能产生不必要的对象,导致性能开销,在循环中尤其明显。
代码示例:
public class LongToStringExample {
public static void main(String[] args) {
long number = 123456789L;
// 使用 "" + long
String str = "" + number;
System.out.println("使用 \"\" + long: " + str);
System.out.println("转换后的类型: " + str.getClass().getName());
}
}
输出:
使用 "" + long: 123456789
转换后的类型: java.lang.String
String.format() - 特殊场景
当你需要对转换后的字符串有特定格式要求时,String.format()是最佳选择,它类似于C语言的sprintf。
特点:
- 功能强大:可以控制数字的格式,例如补零、千分位分隔、科学计数法等。
- 代码冗长:需要编写格式化字符串。
- 性能最差:因为它需要解析格式化字符串,开销远大于前几种方法。
代码示例:
public class LongToStringExample {
public static void main(String[] args) {
long number = 123456789L;
long smallNumber = 42L;
// 1. 基本转换 (不推荐,效率低)
String str1 = String.format("%d", number);
System.out.println("使用 String.format() 基本转换: " + str1);
// 2. 格式化转换:补零
// %08d 表示输出一个整数,总宽度为8位,不足的用0在左边补齐
String str2 = String.format("%08d", smallNumber);
System.out.println("使用 String.format() 补零: " + str2);
// 3. 格式化转换:千分位分隔 (需要Locale)
// %,d 表示用本地化的千分位分隔符
String str3 = String.format("%,d", number);
System.out.println("使用 String.format() 千分位: " + str3);
}
}
输出(取决于你的系统Locale):
使用 String.format() 基本转换: 123456789
使用 String.format() 补零: 00000042
使用 String.format() 千分位: 123,456,789
性能对比
为了直观地展示性能差异,我们可以使用JMH(Java Microbenchmark Harness)进行基准测试,这里给出一个概念性的结果:
| 方法 | 相对性能 | 备注 |
|---|---|---|
Long.toString(long) |
最快 (基准) | 最优选择 |
String.valueOf(long) |
与 Long.toString 几乎一样快 |
性能极佳,风格统一 |
"" + long |
慢 2-5 倍 | 在循环中性能差距会更大 |
String.format("%d", long) |
慢 10-100 倍 | 仅在需要格式化时使用 |
如果你追求极致的性能,Long.toString()是无可争议的最佳选择,如果你的代码风格更倾向于使用String工具类,那么String.valueOf()是同样优秀的选择,避免在性能敏感的代码中使用"" + long或String.format()进行简单的转换。
处理特殊情况:null 值
如果你正在处理可能为null的Long对象(而不是原始类型long),需要小心处理。
Long longObject = null; // Long对象,可能为null
// 错误示范:会抛出 NullPointerException
// String str = longObject.toString();
// 正确做法1:使用静态工具方法(推荐)
String str1 = String.valueOf(longObject); // 如果longObject为null,结果是字符串 "null"
System.out.println("String.valueOf(null): " + str1);
// 正确做法2:使用 Objects.toString()
String str2 = java.util.Objects.toString(longObject, "default_value"); // 如果为null,返回第二个参数
System.out.println("Objects.toString(null, 'default_value'): " + str2);
// 正确做法3:使用条件判断
String str3 = (longObject == null) ? "null" : longObject.toString();
System.out.println("条件判断: " + str3);
对于原始类型long,它永远不可能为null,所以不需要这些特殊处理。
