Hm, ja mislim da baš i nije svejedno.
U slučaju kad radiš String s1 = new String("bla"); kompajler prvo napravi string "bla", zatim pozove konstruktor String(String s) i iskoripira s u novonastali string (s je u ovom slučaju "bla"). Ono što je rezultat je da je dva puta alocirana memorija za isti string, a onaj koji je prvi nastao ostaje da visi da ga GC pokupi. Nisam se mnogo upuštao u ovu priču, ali tako je to meni objašnjeno :). Moja pretpostavka je da je ovo ostavljeno ovako (i da se ne radi samo prevezivanje, nego deep copy stringa) da bi programer imao mogućnost da napravi dva ista stringa na različitim pozicijama u memoriji.
Mislim da je to više predviđeno da se koristi prilikom kreiranja novog stringa od neke promenljive, a ne od hardcode-ovanog stringa, samo mu treba otkriti pravu namenu...
Evo šta kaže dokumentacija u vezi String(String original) konstruktora:
Citat:
Initializes a newly created String object so that it represents the same sequence of characters as the argument; in other words, the newly created string is a copy of the argument string. Unless an explicit copy of original is needed, use of this constructor is unnecessary since Strings are immutable.