Erro ao Imprimir um elemento LinkedList

Olá pessoal, este é meu primeiro post e preciso de uma ajuda básica, do mesmo jeito que espero poder ajudar iniciantes iguais a mim.

Estou tentando simular uma agenda usando LinkedList, e atrávez de um código eu pego o elemento da LinkedList, mas mesmo que eu tenho uma lista com 3 ou mais objetos do tipo Dados com Nome, Endereço etc, ao pedir para imprimir um elemento número X sempre é retornado pra mim os valores do último elemento adicionado à lista.

A agenda foi feito com Form e tudo mais, só que simplifiquei aqui só para efeitos de correção.

[code]package novopacote;
import java.util.*;
import javax.swing.JOptionPane;

final class ClasseTeste {
Dados dados = new Dados();
List lista = new LinkedList();

public void Cadastra(String nomeIn, String ruaIn, String bairroIn, String cidadeIn, String estadoIn, String complementoIn, int numeroIn, int cepIn) {
dados.setDados(nomeIn, ruaIn, bairroIn, cidadeIn, estadoIn, complementoIn, numeroIn, cepIn);
lista.add(dados);
}

public Dados Busca(int codIn) {
return lista.get(codIn - 1);
}

public static void main(String[] args) {
ClasseTeste go = new ClasseTeste();

go.Cadastra("1", "1", "1", "1", "1", "1", 1, 1);
go.Cadastra("2", "2", "2", "2", "2", "2", 2, 2);
go.Cadastra("3", "3", "3", "3", "3", "3", 3, 3);
System.out.println("\nTamanho: " + go.lista.size());
// Apesar de ter três elementos e em baixo eu tentar recuperar informações do elemento 1 (0 para a lista), só me é retornado os valores 3 do último elemento.

System.out.println("1º Nome: " + go.Busca(1).getNome() + "\n2º Nome: " + go.Busca(2).getBairro());

}
}[/code]

[code]package novopacote;

final public class Dados {
private String nome, rua, bairro, cidade, estado, complemento;
private int numero, cep;

public void setDados(String nomeIn, String ruaIn, String bairroIn, String cidadeIn, String estadoIn, String complementoIn, int numeroIn, int cepIn) {
nome = nomeIn;
rua = ruaIn;
bairro = bairroIn;
cidade = cidadeIn;
estado = estadoIn;
complemento = complementoIn;
numero = numeroIn;
cep = cepIn;
}

… // Aqui vem os métodos get.
}[/code]

Resposta:
Tamanho: 3
1º Nome: 3
2º Nome: 3

Deveria ser:
Tamanho: 3
1º Nome: 1
2º Nome: 2

Outra dúvida é que vi aqui no fórum algum coléga falando pra usar List lista = new LinkedList(); ao invéz de LinkedList mesmo. Por que?
Obrigado desde já. =]

Altere esse trecho de código:

public void Cadastra(String nomeIn, String ruaIn, String bairroIn, String cidadeIn, String estadoIn, String complementoIn, int numeroIn, int cepIn) {  
    dados.setDados(nomeIn, ruaIn, bairroIn, cidadeIn, estadoIn, complementoIn, numeroIn, cepIn);  
    lista.add(dados);  
} 

Para:

public void Cadastra(String nomeIn, String ruaIn, String bairroIn, String cidadeIn, String estadoIn, String complementoIn, int numeroIn, int cepIn) {  
    dados = new Dados();
    dados.setDados(nomeIn, ruaIn, bairroIn, cidadeIn, estadoIn, complementoIn, numeroIn, cepIn);  
    lista.add(dados);  
} 

Explicação:

Você não adiciona um objeto na lista… você adiciona a referência a ele. Sempre.
No caso, dados está referenciando sempre o mesmo objeto, portanto você está adicionando referências para o mesmo objeto em locais diferentes da lista. Por isso é que você está imprimindo sempre a mesma coisa.
Ao dar um new, você passa a referência para outro objeto. Aí sim dá certo.

Perdão, só vi a sua outra dúvida agora. Utiliza-se a interface List porque fica mais fácil pra você mudar a implementação depois. Exemplo:

// Podemos alterar
List list = new LinkedList();

// Para
List list = new ArrayList();

// Sem mudar a estrutura do código, pois estamos utilizando a interface List

Dê uma pesquisada pelo fórum para encontrar maiores detalhes!

Nossa eu abri um sorriso aqui que só você vendo rs…
A explicação do List foi ótima também, mas nem sei usar este ArrayList ai. =]

Coléga, ajudou muito mesmo, agora ficou redondinho graças a você.
Obrigado e apesar de eu não saber muito, mas se eu puder ajudar estou a disposição.
Abraço… :smiley: