Boa tarde, Hugo! Como vai?
Então, s1 == s2 resulta em true pois o retorno não é um novo objeto! A classe String trabalha visando otimizar a memória, sendo assim, no código abaixo a saída é true:
String a1 = "a";
String a2 = "a";
System.out.println(a1 == a2); // true.
Isso ocorre pois se já tiver uma String "a" na memória então ela a reutiliza! O algoritmo de reutilização é tão bom que até mesmo partes de strings já criadas podem ser reutilizados! Afinal de contas, imagina o que aconteceria se o Java criasse uma nova string "a" sempre que utilizassemos essa letra! Essa otimização tem base no fato de a classe String criar objetos imutáveis e também na utilização do padrão de projeto flyweight!
Obs.: Um adendo importante é que também há exceções à regra e algumas pegadinhas como visto nessa aula!
Para saber mais:
https://www.geeksforgeeks.org/flyweight-design-pattern/
https://stackoverflow.com/questions/11189155/is-javas-string-intern-a-flyweight
Pegou a ideia? Qualquer coisa é só falar!
Grande abraço e bons estudos, meu aluno!