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

时间:2012-10-30 18:17:34

标签: java coding-style long-integer

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

编码员#1做到了这一点:

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

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

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

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

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

Long(java.lang.String)

和valueOf()的文档在这里:

Long.valueOf(java.lang.String)

据我所知,他们都调用了parseLong(),因此使用哪个并不重要。我只是想确保自己不会在未来的某些奇怪行为中做好准备。另外,哪种风格比其他风格更“正确”(哈哈)?

6 个答案:

答案 0 :(得分:27)

区别在于使用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);
}

答案 1 :(得分:8)

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

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

答案 2 :(得分:3)

他们的意思相同

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

public Long(String s) throws NumberFormatException {
    this.value = parseLong(s, 10);
}

Source JDK 6.0

答案 3 :(得分:3)

内部都parseLong(String, int)(int为基数,值为10),但valueOf有优势,如下所示:

If a new Long instance is not required, this method should generally be used in preference to the constructor Long(long), as this method is likely to yield significantly better space and time performance by caching frequently requested values.

答案 4 :(得分:0)

这是在eclipse上运行的PMD插件输出

我检查过的代码是

Long l = new Long("123456");

在JDK 1.5中,调用new Long()会导致内存分配。 Long.valueOf()对内存更友好。

答案 5 :(得分:0)

我正在考虑如何为我们的应用程序更改缓存的范围和大小,使用Longs重载;

j2se api不支持此类更改 一种方法是使用ClassLoader或甚至使用JVMTI更改加载的Java字节代码 (它允许将这种技巧保留在项目之外,如外部调整)

或者,可能是,创建外部缓存和自己的静态cachedValueOf() 这是直截了当的,但代码取决于一些不适用的需求是不好的

相关问题