Olha só, cara. Talvez eu nem tenha entendido a pergunta, mas, do jeito que você colocou, sempre vai dar false.
Você criou duas referências de pessoa.
Entenda que p e p2 são referências para objetos p e p2 que estão armazenados na memória.
Cada referência guarda um endereço para os respectivos objetos na memória.
Sendo assim, mesmo que ambos estejam com atributos identicos, do jeito que você colocou, sempre vai dar falso pq os endereços das referências sempre serão diferentes.
Caso não tenha respondido sua pergunta, espero pelo menos ter ajudado a entender o conceito de referência de objeto (caso vc ainda não soubesse, claro).
Você poderia fazer uma função que fizesse isso por reflexão, mas ainda assim, isso seria muito complexo, pois envolveria o quão disposta sua função estaria de comparar objetos dentro de objetos (o que piora exponencialmente no caso de listas).
O conceito de igualdade deve ser definido e implementado pelos programadores do sistema. Não é incomum termos mais de um conceito no mesmo sistema. Eu, geralmente, implemento 3 conceitos:
a) Identidade: Indica que um objeto == outroObjeto;
b) Igualdade persistente: Indica que um objeto, no modelo de persistência, tem o mesmo id de outro objeto;
c) Igualdade: Indica que dois objetos tem campos idênticos.
Outros conceitos podem ser implementados para classes específicas. Por exemplo, classes matemáticas costumam a ter relação de semelhança, uma vez que seu teste de igualdade deve levar em consideração um intervalo, ou ele nunca será aprovado, devido a imprecisão natural dos números de ponto flutuante.
Com esses conceitos em mente, todas as classes do sistema são implementadas. Nesse caso, fazendo a devida sobrecarga do hashCode e equals, e criando métodos auxiliares para os outros conceitos que não seguem a regra padrão. O importante é que você os tenha bem definidos no inicio do desenvolvimento, e reforce essas regras constantemente em suas classes.
Não é incomum também criarmos interfaces para reforçar o conceito, como por exemplo:
public interface Persistente {
int getId();
//Testa se dois objetos persistidos tem o mesmo id.
boolean Mesmo(Identificavel outro);
}