Jason Attin wrote:The solutions say F, but should it instead be E and F ?
No, the study guide is spot-on! The correct answer for this question is F. Have a look at this topic where you'll find a great detailed explanation about the exact same question. Definitely worth reading!
Jason Attin wrote:then the value of a is a literal and goes in the string pool and the value of a isn't because we create it after, well, at runtime that is, since it starts with an empty string?
No, that's incorrect! In your code snippet you have 3 String literals which will reside all in the String Literal Pool: "this is a new string", "", and "another string". These strings are already known at compile-time, the compiler doesn't need to execute any code to know the actual value of this String value.
So in your code snippet reference variable a1 first refers to the String literal "" (line2) and on line3 the reference of the String literal "another string" is assigned to reference variable a1.
All the above can be easily illustrated with a code snippet
Right, no in that case I don't think I've understood anything at all. Let me try again. And with your code this time.
In your code you said:
I would have said that the second statement would have been true as well because I would have thought that both a1 and a2 are now pointing to the same object because, from what I've read, when 2 variables of type string contain the same literal (and in your case they both contain "another string" then the value) then both variable are assigned a reference to that same object. Therefore a1 must be == to "another string" and so a2. But of course it's not, and I think I got lost...
Jason Attin wrote:from what I've read, when 2 variables of type string contain the same literal (and in your case they both contain "another string" then the value) then both variable are assigned a reference to that same object.
That's incorrect! The String Literal Pool only applies to String literals (and that's why it is called String Literal Pool of course ). If a String object is created at runtime (using e.g. the String concatenation operator as with reference variable a2 or using a StringBuilder), then this String object will never be in the String Literal Pool for the very simple reason: it is not a String literal, it's a String object created at runtime.
Let's have another look at the code snippet I providedIn this code snippet you have the following String literals: "this is a new string", "", "another string", "another ", and "string". The String Literal Pool will contain all these String literals. But although the String created on line3 has the same value as String literal "another string", it will be a different object. So that means in memory you'll have 2 String objects with the same value: a String literal "another string" (referred by reference variable a1, on line4, and on line5) and a String object "another string" (only referred by reference variable a2).
You should definitely read this post. It contains a very simple explanation (with code snippet) about how String literals might be processed. And I am pretty sure it might help you to understand this concept correctly.