Diving into String (Java)
Ah yes, String. Almost certainly the most used class in the Java and yet I bet you never looked at the source code?
Well there is no time like the present, so lets dive in (source code, if you want to follow along). Okay, first thing first, what happens when we create a string?
Okay from this we can see quite a few things: first (and not too surprisingly) a String is backed by an array of chars. Since strings in Java are immutable we can just refer to the underlying backing store of the original string, which means that we do not use memory to store two two copies of the same thing.
Since the String class stores an offset, you may have guessed how the
substring method is implemented:
This means that substring will avoid wasting memory and that creating a substring is O(1) – with one potential snag: if we later create a new string based on the string created with
substring then (as you might have noticed in the
String constructor code above) it does create a new
char array to back the new
String. Why? Memory usage. As long as one
String instance exist then the entire original
char array has to be kept in memory, even if only a very small part of the array is actually used. This is obviously wasteful, but it is also a very difficult thing to find – and the
String class is used in all the code.