long 是 Java 的基本数据类型,用于表示整数,而 String 是一个对象,用于表示文本,它们之间经常需要互相转换。

long 转 String (将数字转换为字符串)
将一个 long 类型的值变成 String 对象,有几种常见的方法,推荐使用第一种。
使用 String.valueOf(long l) (最推荐)
这是最直接、最清晰、也是性能最好的方法之一,它是一个静态方法,专门用于将各种基本数据类型转换为字符串。
long number = 123456789L; String str1 = String.valueOf(number); System.out.println(str1); // 输出: 123456789 System.out.println(str1.getClass().getName()); // 输出: java.lang.String // 对于负数 long negativeNumber = -987654321L; String str2 = String.valueOf(negativeNumber); System.out.println(str2); // 输出: -987654321
使用 Long.toString(long l) (也很推荐)
Long 是 long 的包装类,它也提供了一个静态方法 toString() 来完成同样的转换,效果和 String.valueOf() 基本一致。
long number = 123456789L; String str = Long.toString(number); System.out.println(str); // 输出: 123456789
使用空字符串拼接 (不推荐,但很常见)
这是一种“取巧”的方法,通过将 long 与一个空字符串 相连,Java 会自动调用 long 的 toString() 方法。

long number = 123456789L; String str = "" + number; System.out.println(str); // 输出: 123456789
为什么不推荐?
虽然代码看起来很简单,但在性能上不如前两种方法,Java 在编译时会将其转换为 new StringBuilder().append("").append(number).toString(),会创建不必要的中间对象,在性能敏感的代码中应避免使用。
使用 String.format() (格式化输出)
当你需要将 long 转换为特定格式的字符串时(添加千位分隔符),String.format() 是最佳选择。
long number = 123456789L;
// 使用千位分隔符
String formattedStr = String.format("%,d", number);
System.out.println(formattedStr); // 输出: 123,456,789
// 指定宽度和补零
String paddedStr = String.format("%015d", number); // 总宽度15,不足用0补齐
System.out.println(paddedStr); // 输出: 00000123456789
String 转 long (将字符串转换为数字)
将一个表示数字的 String 转换为 long 类型,主要使用 Long 包装类的方法。
使用 Long.parseLong(String s) (最常用)
这个方法将 String 参数解析为 long 类型。如果字符串不是一个有效的 long 格式,它会抛出 NumberFormatException 异常。

String str1 = "123456789"; long num1 = Long.parseLong(str1); System.out.println(num1); // 输出: 123456789 // 对于负数 String str2 = "-987654321"; long num2 = Long.parseLong(str2); System.out.println(num2); // 输出: -987654321
异常处理示例:
String invalidStr = "hello123";
try {
long num = Long.parseLong(invalidStr);
System.out.println(num);
} catch (NumberFormatException e) {
System.out.println("错误:字符串 '" + invalidStr + "' 无法转换为 long 类型!");
// e.printStackTrace(); // 打印详细的错误堆栈信息
}
// 输出: 错误:字符串 'hello123' 无法转换为 long 类型!
使用 Long.valueOf(String s) (有细微差别)
Long.valueOf() 也用于将字符串转换为 long,但它返回的是 Long 包装类对象,而不是基本类型 long,如果需要 long,Java 会自动进行拆箱 (unboxing) 操作。
String str = "123456789"; // 返回 Long 对象 Long longObject = Long.valueOf(str); System.out.println(longObject.getClass().getName()); // 输出: java.lang.Long // 自动拆箱为 long 基本类型 long primitiveLong = Long.valueOf(str); // 等同于 longPrimitive = longObject.longValue(); System.out.println(primitiveLong); // 输出: 123456789
parseLong vs valueOf 的选择:
- 如果你明确需要一个
long基本类型,使用Long.parseLong()更直接。 - 如果你需要一个
Long对象(用于泛型集合List<Long>),或者不确定后续是否需要对象形式,使用Long.valueOf()。 - 在性能上,
parseLong通常略快一点点,因为它直接返回基本类型,避免了创建对象的开销(尽管现代JVM优化了这种差异)。
处理带空格的字符串
如果字符串前后有空格,直接调用 parseLong 或 valueOf 会抛出异常,你需要先调用 String.trim() 方法去除首尾空格。
String strWithSpaces = " 123456789 "; long num = Long.parseLong(strWithSpaces.trim()); System.out.println(num); // 输出: 123456789
总结与最佳实践
| 转换方向 | 推荐方法 | 说明 | 示例 |
|---|---|---|---|
| long -> String | String.valueOf(long) |
最清晰、高效,无歧义。 | String s = String.valueOf(123L); |
Long.toString(long) |
同样高效,语义明确。 | String s = Long.toString(123L); |
|
String.format() |
需要格式化(如千位分隔符)时使用。 | String s = String.format("%,d", 123456789L); |
|
| String -> long | Long.parseLong(String) |
最常用,直接返回 long 基本类型。 |
long l = Long.parseLong("123"); |
Long.valueOf(String) |
返回 Long 包装类对象,可用于泛型。 |
Long L = Long.valueOf("123"); |
|
| 异常处理 | try-catch |
parseLong 和 valueOf 在转换失败时都会抛出 NumberFormatException,务必进行捕获处理。 |
try { ... } catch (NumberFormatException e) { ... } |
一个完整的示例
public class LongStringConversion {
public static void main(String[] args) {
// --- long to String ---
long myLong = 9876543210L;
// 推荐方法
String str1 = String.valueOf(myLong);
System.out.println("使用 String.valueOf: " + str1);
// 格式化方法
String str2 = String.format("%,d", myLong);
System.out.println("使用 String.format (带千位分隔符): " + str2);
// --- String to long ---
String numberStr = "123456789";
String invalidStr = "not a number";
try {
// 推荐方法
long parsedLong = Long.parseLong(numberStr);
System.out.println("\n字符串 '" + numberStr + "' 转换为 long: " + parsedLong);
// 处理带空格的字符串
String spacedStr = " 999999999 ";
long parsedSpacedLong = Long.parseLong(spacedStr.trim());
System.out.println("带空格的字符串 '" + spacedStr + "' 转换为 long: " + parsedSpacedLong);
// 演示异常
System.out.println("\n尝试转换无效字符串 '" + invalidStr + "'...");
Long.parseLong(invalidStr);
} catch (NumberFormatException e) {
System.out.println("捕获到异常: " + e.getMessage());
System.out.println("转换失败!请确保输入的字符串是有效的数字格式。");
}
}
}
输出结果:
使用 String.valueOf: 9876543210
使用 String.format (带千位分隔符): 9,876,543,210
字符串 '123456789' 转换为 long: 123456789
带空格的字符串 ' 999999999 ' 转换为 long: 999999999
尝试转换无效字符串 'not a number'...
捕获到异常: For input string: "not a number"
转换失败!请确保输入的字符串是有效的数字格式。 