Comparação de Strings com equals e ==

Olá a todos
Estava estudando para a certificação e fiz o seguinte código


public class Strings {
	public static void main(String[] args) {
		String s  = new String("palavra 1");
		String s2 = new String("palavra 1");
		
		String s3 = "palavra 1";
		String s4 = "palavra 1";
		
		System.out.println(s.equals(s2));
		System.out.println(s == s2);
		
		System.out.println(s.equals(s3));
		System.out.println(s == s3);
		
		System.out.println(s3 == s4);
	}
}

O resultado é o seguinte:

true
false
true
false
true

Queria saber pq a última comparação pode ser feita com o “==” e retorna true, visto que ambos s3 e s4 são objetos da classe String e deveria comparar as referências e não o conteúdo!
abraço a Todos

Existem diversas perguntas sobre isso no forum, só da uma pesquisada, mas responde a pergunta, o Java trabalha com um “pool” de Strings, ou seja quando a String é criada usando “”, ele cria no pool essa string, quando ela é criada de novo, o objeto jã esta no pool e não é criado umnovo objeto, ou seja é a mesma referencia.

quando se usa o new a referencia e outra