杰瑞科技汇

Java Long与String如何高效转换?

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

Java Long与String如何高效转换?-图1
(图片来源网络,侵删)

longString (将数字转换为字符串)

将一个 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) (也很推荐)

Longlong 的包装类,它也提供了一个静态方法 toString() 来完成同样的转换,效果和 String.valueOf() 基本一致。

long number = 123456789L;
String str = Long.toString(number);
System.out.println(str); // 输出: 123456789

使用空字符串拼接 (不推荐,但很常见)

这是一种“取巧”的方法,通过将 long 与一个空字符串 相连,Java 会自动调用 longtoString() 方法。

Java Long与String如何高效转换?-图2
(图片来源网络,侵删)
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

Stringlong (将字符串转换为数字)

将一个表示数字的 String 转换为 long 类型,主要使用 Long 包装类的方法。

使用 Long.parseLong(String s) (最常用)

这个方法将 String 参数解析为 long 类型。如果字符串不是一个有效的 long 格式,它会抛出 NumberFormatException 异常。

Java Long与String如何高效转换?-图3
(图片来源网络,侵删)
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优化了这种差异)。

处理带空格的字符串

如果字符串前后有空格,直接调用 parseLongvalueOf 会抛出异常,你需要先调用 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 parseLongvalueOf 在转换失败时都会抛出 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"
转换失败!请确保输入的字符串是有效的数字格式。
分享:
扫描分享到社交APP
上一篇
下一篇