Bits of Java – Episode 10: String Pool
Today we will discuss about the String Pool. What is it? Well, in the last post we talked about the fact that String
are immutable, and that every time you manipulate a String
you are actually creating a new object in memory, which is, for sure, not the most efficient approach.
In this sense, you can think about the String Pool as a space in memory where Java stores literal values and constants, that can be reused multiple times. This does not mean that String
stop to be immutable and all the things that we discussed before are no more valid!
It simply means that, when you create a String
, under certain conditions that we will see in a moment, Java first looks in the String Pool whether the same object exists, and, if so, it returns you a reference to it!
What are the certain conditions I was talking about? First of all, not with all the ways of creating a String
we are saying to Java to look in the pool! Let’s see an example:
String name = "Ilenia";
String sameName = "Ilenia";
String againSameName = new String("Ilenia");
When you create a String
using a literal, this tells Java to first look in the pool, and, if no object like this is found in the pool it will be added. This means that in the first line of our example, Java will look in the pool for such a String
object, it probably does not find it assuming this happens very early in our program, and so it adds it. In the second line we are creating again a String
using a literal, which is the same as before; thus, this time Java will find an object in the pool and it would set sameName
to reference that object.
The third line, on the other hand, is different. We are creating a String
with the same content of the other two, but this time we are not using a literal, but the new
keyword. This forces Java to really create a new object, even if in the pool it would have something appropriate for it!
The concept of the String Pool is important in terms of efficiency, but it can also create some confusion, especially when it comes to the equality operator (==
).
You probably all know that when you apply the ==
operator to a reference variable, what it does is checking whether the objects referenced by the two operands are actually the same object. Thus, this is a good point where, knowing what the String Pool is and what it does can make the difference!
String name = "Ilenia";
String sameName = "Ilenia";
String againSameName = new String("Ilenia");
System.out.println(name == sameName); //prints true
System.out.println(name == againSameName); //prints false
The first print statement will print true
, because the two variables actually point to the same object in the String Pool, while the second print statement will print false
, because we have explicitly asked Java to create a new object for the variable againSameName
!
Let’s complicate a bit the things, shall we? In general, if two String
objects do not evaluate to the same String
at compile time, a new object is created!
String name = "Ilenia";
String sameName = " Ilenia".substring(1);
System.out.println(name == sameName); //prints false
In this case, the second line is evaluated at runtime, and so the objects the two variables are referring to are actually two different objects, resulting in the print statement displaying false
.
String name = "Ilenia";
String sameName = "Ile" + "nia";
String againSameName = "Ile";
againSameName += "nia";
System.out.println(name == sameName); //prints true
System.out.println(name == againSameName); //prints false
Again, the second line is a concatenation which will be evaluated at compile time, and so the two variables, name
and sameName
, actually reference to the same object; while the third variable is concatenated at runtime, resulting in a different object to be created!
String
has also a method intern()
, to force Java to look in the pool and use an object from there if there is.
String name = "Ilenia";
String againSameName = new String("Ilenia").intern();
System.out.println(name == againSameName); //prints true
In this case we are creating the String
using the new
keyword, but then we are using the intern()
method, thus Java actually will use the pool and find a suitable object, which is the same as the one referenced by name
, making the two variables equals (in the sense of the ==
operator).
I hope you enjoyed the discussion and you learned something new too!
Next week we will abandon the String
and start talking about Array
, in particular about Arrays.binarySearch
and Arrays.compare
!
by Ilenia Salvadori