Dlaczego tak
Operator == porównuje w Javie referencje obiektów, a new String("tak") tworzy nowy obiekt, inny niż literał "tak" z puli napisów, dlatego a == b daje false. Metoda equals porównuje zawartość napisów, więc a.equals(b) daje true. Odpowiedź „true true” to typowy błąd osób przenoszących nawyki z C#, w którym operator == dla typu string porównuje treść.