"a" znajdzie się w puli Stringów dla danego pliku .class. Jeżeli masz wiele zmiennych w jednym pliku zainicjalizowanych tym samym Stringiem, tzn:
String a1 = "a";
String a2 = "a";
Wtedy operator == powinien dla nich zwrócić true, bo to referencje do tego samego Stringa. Z drugiej strony za pomocą zapisu:
String s = new String("a");
Wymuszasz stworzenie nowego Stringa, obojętne czy był już w puli czy nie.
Ogólnie nie wolno porównywać Stringów za pomocą operatora ==. Gdyby mój (współ)pracownik w ten sposób porównywał Stringi (albo jakiekolwiek inne obiekty) to podziękował bym mu za współpracę. String.equals() to jedyna metoda do sprawdzania identyczności Stringów.