Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Are strings created with + concatenation stored in the string pool?

For instance

 String s = "Hello" + " World";

I know there are two strings in the pool "Hello" and "World" but, does: "Hello World" go into the string pool?

If so, what about?

String s2 = new String("Hola") + new String(" Mundo");

How many strings are there in the pool in each case?

like image 594
OscarRyz Avatar asked Jun 12 '10 16:06

OscarRyz


2 Answers

Yes, if a String is formed by concatenating two String literals it will also be interned.

From the JLS:

Thus, the test program consisting of the compilation unit (§7.3):

package testPackage;
class Test {
    public static void main(String[] args) {
        String hello = "Hello", lo = "lo";
        System.out.print((hello == "Hello") + " ");
        System.out.print((Other.hello == hello) + " ");
        System.out.print((other.Other.hello == hello) + " ");
        System.out.print((hello == ("Hel"+"lo")) + " ");
        System.out.print((hello == ("Hel"+lo)) + " ");
        System.out.println(hello == ("Hel"+lo).intern());
    }
}
class Other { static String hello = "Hello"; }
and the compilation unit:
package other;
public class Other { static String hello = "Hello"; }

produces the output:

true
true
true
true
false
true

The important lines are 4 and 5. 4 represents what you are asking in the first case; 5 shows you what happens if one is not a literal (or more generally, a compile-time constant).

like image 173
danben Avatar answered Nov 15 '22 21:11

danben


I believe in the first case the compiler will be clever and put the concatenated string in the pool (i.e. you'll have only 1 string there)

like image 29
Brian Agnew Avatar answered Nov 15 '22 22:11

Brian Agnew