Long.valueOf(java.lang.String) 和 new Long(java.lang.String) 之间的区别?

2022-09-01 11:56:32

我正在合并由两个不同的人编写的代码,并注意到将 String 值转换为 Long 是以两种不同的方式完成的。

Coder #1 已经做到了这一点:

String strId = "12345678";
...
Long lId = new Long(strId);

虽然编码器#2已经这样做了:

String strId = "12345678";
...
Long lId = Long.valueOf(strId);

在功能上,代码的操作完全相同。每个位周围都有一个 try/catch 块来处理任何抛出的内容。传入字符串值是一个表示小数的 8 位字符串:在这两种情况下,它都正确地转换为 。NumberFormatException"12345678"Long

在构造函数中传递字符串和使用 Long.valueOf() 之间是否存在任何功能差异?我在这里检查了构造函数文档:

Long(java.lang.String)

和 valueOf() 的文档在这里:

Long.valueOf(java.lang.String)

据我所知,他们都调用 parseLong(),所以使用哪个并不重要。我只是想确保我不会让自己在以后的道路上做出一些奇怪的行为。另外,任何一种风格都比另一种风格更“正确”(哈哈)吗?


答案 1

不同之处在于,使用 您将始终创建一个新对象,而使用 可能会返回缓存的值,如果该值介于 之间。new Long()Long.valueOf()long[-128 to 127]

因此,您应该更喜欢方法,因为它可以节省一些内存。Long.valueOf

如果你看到 的源代码,它在内部调用 ,我在下面发布了它的源代码: -Long.valueOf(String)Long.valueOf(long)

public static Long valueOf(String s) throws NumberFormatException
{
    return Long.valueOf(parseLong(s, 10));
}

public static Long valueOf(long l) {
    final int offset = 128;
    if (l >= -128 && l <= 127) { // will cache 
        return LongCache.cache[(int)l + offset];
    }
    return new Long(l);
}

答案 2

Long.valueOf()应该是首选:它为一些常用值返回 Long 的缓存值,而不是像构造函数那样构造一个新实例。

即使某些 Java 版本不使用缓存,使用也会在将来的版本中实现,而构造函数将始终创建一个新实例。valueOf()