Se ridefinisci equals in una tua classe es. in IndirizzoPersona, sei tu che puoi (e devi) stabilire COSA confrontare per indicare se due oggetti sono "equivalenti". Solo nome e cognome? Anche email? Anche telefono?
Quando per te due oggetti IndirizzoPersona sono in pratica "uguali"?
Riguardo la identità vs contenuto, la identità si riferisce alla uguaglianza di reference.
Integer a = new Integer(123);
Integer b = new Integer(123);
Integer c = a;
a == b dà false. Hanno lo stesso contenuto (valore 123) ma sono due oggetti DISTINTI, il reference non è uguale. Hanno identità differenti.
a == c dà true perché le due variabili hanno lo stesso reference (l'oggetto è uno solo, che lo "vedi" da a o da c).
Potresti "sorvolare" su quest'aspetto. hashCode() si usa principalmente nelle collezioni basate su hash-table.