Every compile-time constant expression that is of type
String will be put into the String pool.
Essentially that means: if the compiler can (easily) “calculate” the value of the
String without running the program, then it will be put into the pool (the rules are slightly more complicated than that and have a few corner cases, see the link above for all the details).
That’s true for all the Strings in lines 1-3.
"Hel"+lo is not a compile-time constant expression, because
lo is a non-constant variable.
The hash codes are the same, because the hashCode of a String depends only on its content. That’s required by the contract of