On this blog post, it\'s said that the minimum memory usage of a String is:
8 * (int) ((((no chars) * 2) + 45) / 8)
bytes.
So for the String \"Apple
Is it possible to save character data using less memory than a Java String? Yes.
Does it matter for "enterprise" applications (or even Android or J2ME applications, which have to get by on a lot less memory)? Almost never.
Premature optimization is the root...
String storage in Java depends on how the string was obtained. The backing char
array can be shared between multiple instances. If that isn't the case, you have the usual object overhead plus storage for one pointer and three int
s which usually comes out to 16 bytes overhead. Then the backing array requires 2 bytes per char
since char
s are UTF-16 code units.
For "Apple Computers"
where the backing array is not shared, the minimum cost is going to be
int
s for the offset, length, and memoized hashcode - 12Bint
for the array length.So roughly 72B of which the actual payload constitutes 44.4%. The payload constitutes more for longer strings.
In Java7, some JDK implementations are doing away with backing array sharing to avoid pinning large char
[]s in memory. That allows them to do away with 2 of the three int
s.
That changes the calculation to 64B for a string of length 16 of which the actual payload constitutes 50%.
Compared to a other data types that you have, it is definitely high. The other primitives use 32 bits,64 bits,etc.
And given that String
is immutable, every time you perform any operation on it, you end up creating a new String
object, consuming even more memory.