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

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

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

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

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

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

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

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

龙(java.lang.String中)

以及valueOf()的文档:

Long.valueOf(java.lang.String中)

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

不同之处在于使用new Long()将始终创建一个新对象,而使用Long.valueOf() ,如果值介于[-128 to 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); } 

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

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

他们的意思是一样的

 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); } 

来源JDK 6.0

两者都在内部执行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.

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

我检查的代码是

 Long l = new Long("123456"); 

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

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

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

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