Equality delle stringhe vs uguaglianza di posizione

String s1 = "BloodParrot is the man"; String s2 = "BloodParrot is the man"; String s3 = new String("BloodParrot is the man"); System.out.println(s1.equals(s2)); System.out.println(s1 == s2); System.out.println(s1 == s3); System.out.println(s1.equals(s3)); 

// produzione
vero
vero
falso
vero

Perché non tutte le stringhe hanno la stessa posizione in memoria se tutte e tre hanno lo stesso contenuto?