Achei isso, espero que ajude
String é um objeto, o metodo equals(Object) vai retornar true se ambas as Strings tiverem o mesmo objeto. O operador == só ira retornar true se ambas referencias de String apontarem para a mesma referencia do objeto.
Quando criamos uma String de forma literal é criado um pool de Strings, quando criamos uma outra String literal com o mesmo valor a JVM procura se ja existe uma String com esse mesmo valor no pool de Strings, caso exista, faz sua variável apontar para o mesmo endereço de memória. Por este motivo, quando você testa a igualdade das variáveis a e b através do "==", ela retorna true.
String a = "abc"; //pool de string
String b = "abc"; /ja existe uma string com o mesmo conteúdo no pool,
vai para a mesma referencia na memória/
String c = "dda"; //vai para uma nova referencia de memoria pois não existe no pool
Se você criar strings assim, você está criando um novo objeto em memória e se testar a igualdade das variáveis a e d com "==", ela retornará false, pois não apontam para o mesmo lugar na memória.
String d = new String("abc"); //Cria um novo objeto na memoria
String a = "abc";
String b = "abc";
String c = "dda";
String d = new String("abc");
a==b = true
a==c = false
a==d = false
a.equals(d) = true