Возможно, это слишком тривиально / старо / хорошо известно, но компилятор Java оптимизирует строковые литералы и конкатенации с использованием пула String и StringBuilders:
String a = "a";
String b = "a";
String c = a + b + someUserInput;
будет на самом деле ближе к
String a = "a";
String b = a;
String a_b = "aa";
String c = new StringBuilder(a_b).append(someUserInput).toString();
или, может быть, даже (не уверен)
String a_b = "aa";
String a = a_b.substring(0,1);
String b = a;
String c = new StringBuilder(a_b).append(someUserInput).toString();
Кроме того, фокус оптимизации для компилятора Java сместился с компиляции на байт-код (javac) на компиляцию с байт-кода на машинный код (Hotspot). Я думаю, что раньше было больше оптимизаций в javac, но они обнаружили, что это немного преждевременно, учитывая, что Hotspot может выполнять здесь гораздо более тщательную работу (и опираться на знания во время выполнения о реальном оборудовании и шаблонах использования).
Другим интересным аспектом этого является то, что оптимизация Hotspot может улучшить производительность еще долго после того, как код был написан и скомпилирован. Например, описанная выше оптимизация StringBuilder использовала (немного менее эффективный) класс StringBuffer до Java 5. Чтобы получить последние улучшения, вам нужно будет перекомпилировать код (что все же лучше, чем оптимизировать вручную для использования StringBuffer раньше, и в этом случае вам действительно нужно обновить код).