В вашем примере только первые 3 будут созданы в пуле строк, а последние два будут строковым объектом в куче.Причина в том, что когда вы объединяете строку с помощью оператора +, она проверяет, существует ли результирующая строка в пуле строк, затем она возвращает ссылку, в противном случае она создаст новый объект String, даже если строки, которые вы используете для создания новогоодин уже в бассейне.Вы можете проверить, что при выполнении следующих действий:
greeting == "Hello World!"
goodbye == "Bye World!"
в обоих случаях будет возвращено значение false, что показывает, что их нет в пуле.