Difference between Long.valueOf(java.lang.String) and new Long(java.lang.String)?
coding-style, java, long-integer
Solution
The difference is that using `new Long()` you will always create a new object, while using `Long.valueOf()`, may return you the cached value of `long` if the value is between `[-128 to 127]`.
So, you should prefer `Long.valueOf` method, because it may save you some memory.
If you see the source code for `Long.valueOf(String)`, it internally invokes `Long.valueOf(long)`, whose source code I have posted below: -
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);
}
Problem
I'm consolidating code written by two different people and notice that casting a String value into a Long has been done in two different ways. Coder #1 has done this: ``` String strId = "12345678"; ... Long lId = new Long(strId); ``` While coder #2 has done this: ``` String strId = "12345678"; ... Long lId = Long.valueOf(strId); ``` Functionally, the code operates exactly the same. There's a try/catch block around each bit to handle any `NumberFormatException` that is thrown. The incoming string value is an 8 digit string that represents a decimal: `"12345678"` and in both cases it is correctly converted into `Long`. Is there any functional difference between passing the string in the constructor and using Long.valueOf()? I've checked the constructor doc here: Long(java.lang.String) and the docs for valueOf() here: Long.valueOf(java.lang.String) As far as I can tell, they both call parseLong() so it doesn't matter which is used. I just want to make sure I'm not setting myself up for some strange behavior further down the road. Also, is either style more "correct" (haha) than the other?