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

AWT*_*AWT 28 java coding-style long-integer

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

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

String strId = "12345678";
...
Long lId = new Long(strId);
Run Code Online (Sandbox Code Playgroud)

编码器#2做到了这一点:

String strId = "12345678";
...
Long lId = Long.valueOf(strId);
Run Code Online (Sandbox Code Playgroud)

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

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

龙(java.lang.String中)

以及valueOf()的文档:

Long.valueOf(java.lang.String中)

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

Roh*_*ain 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);
}
Run Code Online (Sandbox Code Playgroud)

  • @ArunManivannan ..您可以在jdk安装目录中找到源代码.转到`C:\ Program Files\Java\jdk`会有一个`src`文件夹.可能是压缩格式.解压缩它.转到`java - > lang - > Long.class`查看源代码. (2认同)

JB *_*zet 8

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

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