Bom dia pessoal, eu to com uma duvida bem basica aki
eu construi uma classe aluno e sobrescrevi o metodo equals para comparar usando o atributo nome
public class Aluno {
public String nome;
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
@Override
public boolean equals(Object obj) {
Aluno o = (Aluno)obj;
if (o.getNome().equals(this.nome)){
return true;
}else{
return false;
}
}
}
criei uma classe teste
import java.util.ArrayList;
import java.util.List;
public class Teste {
public static void main(String[] args) {
List agenda = new ArrayList();
Aluno a = new Aluno();
a.setNome("a");
agenda.add(a);
a.setNome("b");
System.out.println(agenda.contains(a));
}
}
Esse syso ta me retornando true mesmo com os atributos diferentes.
eu sei resolver esse “problema” e geralmente não crio objetos desse jeito. mas um dia eu tava dando uma mexida aqui e ali e me ocorreu essa duvida alguem sabe o por que?
geralmente quando eu tenho que botar varios objetos da mesma classe num lista ou array eu ponho…
a= new Aluno();
…antes de cada novo objeto (me falem se eu desse jeito esta errrado ou se tiver algum melhor tambem))
Você está trabalhando com o mesmo objeto Aluno o tempo todo, nessas condições o teste sempre retornará true. Crie um novo objeto Aluno com nome diferente do inicial e faça o teste novamente:
Aluno b = new Aluno();
b.setNome("b");
System.out.println(agenda.contains(b));
Roger seu codigo certamente funcionara mas essa não é a duvida, como voce pode ver na classe aluno eu modifiquei o equals para fazer a comparação usando o atributo nome, e mesmo sendo o mesmo objeto ele tem um nome diferente
a.setnome("a");
agenda.add(a);
//aqui se voce fizer um a.getNome() vai devolver "a"
a.setNome("b");
//aqui o getNome vai devolver "b"
com isso como pode o contains devolver true?? se o atributo usado para comparação no equals é diferente???
*isso realmente NÃO é um problema eu sei fazer do jeito correto, eu quero saber por que desse jeito da errado!!
Quando você insere na lista, vc insere um elemento com o nome “a”. Quando você muda o nome para “b”, vc tmb muda na lista, porque a lista mantém uma referência para esse objeto, não uma cópia.
Realmente, o objeto a na na lsita muda o nome tambem, mas porque se eu nao mexi na agenda?eu nao teria que usar alguma coisa como agenda.get(0).setName ou coisa do genero???
Eu tentei fazer um teste um poco mais simples mas com array.
int r;
int arr[] = new int[5];
r = 5;
arr[0]=r;
r=6;
System.out.println(arr[0]);
//me retornou 5
talves seja por que o array é diferente de list…ou por que aqui eu to passando um int em ves de um objeto…
é pelo jeito é por que é int eu testei com objeto agora
Aluno a = new Aluno();
int r;
Aluno arr[] = new AlunoVO[5];
a.setNome("a");
arr[0]=a;
a.setNome("b");
System.out.println(arr[0].getNome());
//me retornou b!!!!!
Quando você insere na lista, vc insere um elemento com o nome “a”. Quando você muda o nome para “b”, vc tmb muda na lista, porque a lista mantém uma referência para esse objeto, não uma cópia.[/quote]
Agora sim, foi mal eu nao tinha lido direito!!!
entao na lista fica uma referencia a desse objeto. OK
mas por que com tipos primitivos não acontece o mesmo???