Todas as strings criadas com aspas "", são armazenadas num local especial de memória.
Portanto:
String x = "Vinicius";
String y = "Vinicius";
vão apontar para o mesmo objeto, no mesmo local. É como se o Java fizesse isso:
String oculta = new String("Vinicius");
String x = oculta;
String y = oculta;
Como os dois apontam para o mesmo local da memória
Retorna true.
Agora, se você usar o new, você está forçando a criação de um novo objeto.
Portanto se:
String a = "Vinicius";
String b = new String("Vinicius");
a == b
retorna false.
O equals faz uma comparação com base no conteúdo, e não em endereços de memória. Ou seja, o código do equals deve se parecer com isso:
public boolean equals(String outra) {
if (outra == null || outra.length != this.length)
return false;
for (int i = 0; i < this.length; i++)
if (this.chatAt(i) != outra.charAt(i))
return false;
return true;
}
Portanto, em ambos os casos:
x.equals(y); // retorna true
E
a.equals(b); //retorna true.