Valor da lista sendo alterado na memória

Meu problema é basicamente o seguinte:

Tenho essas duas listas da mesma classe.

ArrayList<P> p2 = new ArrayList<P>();
ArrayList<P> p3 = new ArrayList<P>();

O que acontece é que quando faço esta operação:

            for(int k=0; k<getF(); k++)
			{
				for(int i=0; i<NumFilhos; i++)
				{
					for(int j=0; j<NumFilhos; j++)
					{
						if(p2.get(j).getF().get(k).equals(listFs.get(k).get(i)))
						{
							
					        p3.add(p2.get(j)); 
                            p2.get(j).getF().set(k, -1.);
							break;
						}
					}
				}
			}

os valores de p3 sofrem a operação feita em p2, mesmo com a operação sendo feita depois.
Ao meu entender, é porque as variaveis de p2 possuem o mesmo endereço de memória de p3, porém como eu consigo adicionar o valor de p2 a p3, e alterar somente p2? Tem como fazer o p3 e p2 possuirem endereços de memoria diferentes? Ou alguma forma de adicionar os valores de p2 a p3 e alterar p2 sem que p3 também sofra as alterações?

Resolvi mas não sei se é a opção ideal, sobrescrevi o método clone na classe:

@Override 
	public P clone() 
	{ 
		P novo = new P(); 
		novo.setDist(getDist());
		novo.setId(getId());
		novo.setNp(getNp()); 
		for(int i=0; i<getF().size(); i++)
		{
			novo.addF(getF().get(i));
		}
		for(int i=0; i<sp.size(); i++)
		{
			novo.addP(i);
		}
		return novo;
	}
}

Alterando é claro em cima:

public class P implements Comparable<P>, Cloneable

E a parte do codigo ficou assim:

						P aux = new P();
						aux = p2.get(j).clone();
						p3.add(aux); // 
						p2.get(j).getF().set(k, -1.);
						break;

Criando 2 instâncias.

1 curtida

Mas eles são duas instancias, porem que possuem campos identicos e apontam para o mesmo endereço de memoria, o que acabou fazendo com que eles fossem instancias iguais, mas pelo visto clonar foi a melhor opção.

Não, se apontam para o mesmo endereço de memória então não são duas instâncias. É uma instância com duas referências.
Posta o código onde você inicializa essas variáveis.

Mas foi a primeira coisa que eu postei.

Isso aí é a instanciação do ArrayList.
Onde é que você instancia os objetos que são inseridos nele?
Provavelmente estás adicionando as mesmas instâncias dos objetos em ambas as listas.