Long.valueOf(java.lang.String)和new Long(java.lang.String)之间的差异?

Long.valueOf(java.lang.String)和new Long(java.lang.String)之间的差异?,java,coding-style,long-integer,Java,Coding Style,Long Integer,我正在合并由两个不同的人编写的代码,并注意到将字符串值转换为Long的方法有两种 编码器1已经做到了这一点: String strId = "12345678"; ... Long lId = new Long(strId); String strId = "12345678"; ... Long lId = Long.valueOf(strId); 虽然编码器#2已经做到了这一点: String strId = "12345678"; ... Long lId = new Long(str

我正在合并由两个不同的人编写的代码,并注意到将字符串值转换为Long的方法有两种

编码器1已经做到了这一点:

String strId = "12345678";
...
Long lId = new Long(strId);
String strId = "12345678";
...
Long lId = Long.valueOf(strId);
虽然编码器#2已经做到了这一点:

String strId = "12345678";
...
Long lId = new Long(strId);
String strId = "12345678";
...
Long lId = Long.valueOf(strId);
在功能上,代码的操作完全相同。每个位周围都有一个try/catch块来处理抛出的任何
NumberFormatException
。传入字符串值是一个8位字符串,表示十进制:
“12345678”
,在这两种情况下,它都正确地转换为

在构造函数中传递字符串和使用Long.valueOf()在功能上有什么区别吗?我已经在这里检查了构造器文档:

valueOf()的文档如下:

据我所知,它们都调用parseLong(),所以使用哪一个并不重要。我只是想确定我没有让自己在今后的道路上有什么奇怪的行为。还有,两种风格是不是比另一种更“正确”(哈哈)?

它们的意思是一样的

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);
}
Long.valueOf()
应该是首选:它为一些常用值返回缓存的Long值,而不是像构造函数那样构造新实例

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

两者都在内部使用
parseLong(String,int)
(int是基数,值为10),但
valueOf
具有如下所述的优势:


如果不需要新的Long实例,通常应优先使用此方法而不是构造函数Long(Long),因为此方法可能通过缓存频繁请求的值来产生显著更好的空间和时间性能。
不同之处在于使用
new Long()
使用
Long.valueOf()
时,您将始终创建一个新对象,如果该值介于
[-128到127]
之间,则可以返回缓存的
Long

因此,您应该更喜欢
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);
}
public静态长值of(字符串s)引发NumberFormatException
{
返回Long.valueOf(parseLong(s,10));
}
公共静态长期价值(长期l){
最终整数偏移=128;

如果(l>=-128&&l这是在eclipse上运行的PMD插件输出

我查过的代码是

Long l = new Long("123456");

在JDK 1.5中,调用新的Long()会导致内存分配。Long.valueOf()更便于内存使用。

我正在考虑如何更改应用程序的缓存范围和大小,因为它会导致Long过载

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

或者,可以创建外部缓存并拥有静态cachedValueOf()
这是直截了当的,但取决于一些非应用需求的代码并不好

Arun,如果s超出某个范围(-128 t0 127),它们是相同的,如果在范围内,则它们不相同。您使用的是哪一版本的Java?在我的Java 6和7版本中,使用了缓存。@Nambari我也这么认为。但是,实现是令人惊讶的。@JBNizet谢谢您的注释。6.0。相应地编辑了文章。即使在JDK 6中,它们的字面意思也不一样;它们只是碰巧有相同的行为。它们的含义是由Javadoc定义的。这正是我在查找之前所理解的。请您共享源链接。@ArunManivannan..您可以在jdk安装目录中找到源代码。转到
C:\Program Files\Java\jdk
将有一个
src
文件夹。可能是压缩格式。解压缩它。转到o
java->lang->Long.class
以查看源代码。这非常有帮助,感谢您的代码片段和解释。@torgis。不客气:)。当您对某些方法有疑问时。请记住,您总是要检查源代码。在
JDK
安装目录中。您只需要知道要搜索的适当包名。这可能会节省内存,但通常会浪费处理器时间。值范围为
[-128到127]
具体来说。但是,我认为这是可以改变的。不知道具体如何。这是问题的答案吗?你应该使用
问题
选项提问。