Когда делаешь вот так String v1 = "Text"; , то "Text" ищется в пуле стрингов, если находится, то возвращается ссылка на него, если нет, то создается новый объект, пихается в пул. Соответственно второй раз мы получим уже ссылку из пула.
А вот тут будет 2 объекта
String v1 = "Text";
String v2 = new String("Text");
System.out.println(v2);
Андрей Шишкин: а разве "foo"+" " не будет создан как отдельный объект, а затем "foo"+" "+"bar"? я еще не изучал String должным образом, но как работает оператор + уже прочитал :)
WTFAYD:
Да, вполне возможно. Просто не сразу сообразил посыл вашего предыдущего сообщения, сори.
По сути даже больше четырех.
1. "foo"
2. "bar"
3. " "
4. "foo "
5. "foo bar"
Так что если есть необходимость в большой конкатенации строк, нужно юзать StringBuilder или StringBuffer. Эти типы изменяемы.
Андрей Шишкин: Тут зависит от реализации компилятора. По умолчанию последний пример, скорее всего, трансформируется в одну строку. Если там будут переменные, то будет использован StringBuilder для конкатенации.
Тут работают минимум два объекта: строка "Text" и System.out. это если мы не говорим о внутренней реализации каждого из них и устройстве виртуальной машины. Неявно создадутся объекты типа Class для String, System, PrintWriter.. и для всего, что у них есть внутри)