I am working in Java code optimization. I'm unclear about the difference between String.valueOf
or the +""
sign:
int intVar = 1;
String strVar = intVar + "";
String strVar = String.valueOf(intVar);
What is the difference between line 2 and 3?
Ask yourself the purpose of the code. Is it to:
It sounds much more like the latter to me... which is why I'd use
String.valueOf
. Whenever you can make your code read in the same way as you'd describe what you want to achieve, that's a good thing.Note that this works for all types, and will return "null" when passed a null reference rather than throwing a
NullPointerException
. If you're using a class (not anint
as in this example) and you want it to throw an exception if it's null (e.g. because that represents a bug), calltoString
on the reference instead.This approach uses StringBuilder to create resultant String
This approach invokes simply a static method of
String
to get the String version of intwhich in turn calls
Integer.toString()
I'd prefer
valueOf()
, because I think it's more readable and explicit.Any concerns about performance are micro-optimizations that wouldn't be measurable. I wouldn't worry about them until I could take a measurement and see that they made a difference.
Concatenating Strings and other variables actually uses
String.valueOf()
(andStringBuilder
) underneath, so the compiler will hopefully discard the empty String and produce the same bytecodes in both cases.Well, if you look into the JRE source code,
Integer.getChars(...)
is the most vital method which actually does the conversion from integer to char[], but it's a package-private method.So the question is how to get this method called with minimum overhead.
Following is an overview of the 3 approaches by tracing the calls to our target method, please look into the JRE source code to understand this better.
"" + intVar
compiles to :new StringBuilder()
=>StringBuilder.append(int)
=>Integer.getChars(...)
String.valueOf(intVar)
=>Integer.toString(intVar)
=>Integer.getChars(...)
Integer.toString(intVar)
=>Integer.getChars(...)
The first method unnecessarily creates one extra object i.e. the StringBuilder.
The second simply delegates to third method.
So you have the answer now.
PS: Various compile time and runtime optimizations come into play here. So actual performance benchmarks may say something else depending on different JVM implementations which we can't predict, so I generally prefer the approach which looks efficient by looking at the source code.
The first line is equivalent to
so that there is some extra (and pointless) work to do. Not sure if the compiler optimizes away concatenations with empty string literals. If it does not (and looking at @Jigar's answer it apparently does not), this will in turn become
So you should really be using String.valueOf directly.