Problema com o ArrayList

Quando eu armazeno algo com ArrayList e vou ler, todos os índices anteriores quando exibidos
a nova adição ocupa o lugar das outras.

Exemplo:

class Dados(){
int valor;
String texto;

  Dados(){
     this.valor = 0;
     this.texto = "";
  }

}

class main{
public static void main(String args[]){
int indice = 0;
Dados dados = new Dados();
ArrayList array = new ArrayList();
dados.valor = 0;
dados.texto = a;
array.add(indice, dados);
indice++;
dados.valor = 1;
dados.texto = b;
array.add(indice, dados);

System.out.println("Valor: "+array.get(0).valor+" Texto:  "+array.get(0).texto+ "Indice: "+0);
System.out.println("Valor: "+array.get(1).valor+" Texto:  "+array.get(1).texto+ "Indice: "+1);

} // método main
} // classe main

Quando vou exibir dá o mesmo resultado, sempre a última coisa adicionada irá substituir e só muda o indice, no caso irá exibir “Valor : 1 Texto: b Indice: 0” e “Valor : 1 Texto: b Indice: 1”

Obs: Isso é apenas uma representação do meu código, mas quando eu criei um parecido apenas para teste descobri que estava ocorrendo, antes achava que era um problema no meu laço de repetição, mas mesmo sem o laço ainda sim ocorre o mesmo erro, se eu inclui-se depois valor 2 e texto c, iria exibir 3 vezes esse valor, mudando apenas o indice…

Opa

vejamos, suas classes tem diversas inconsistências, Sua classe dados está com as variáveis expostas, é mais seguro declarar elas como private, e usar os metodos de acesso “gets” e “sets” para alterar e ler as veriáveis assim:

public class Dados {

private int valor;
private String texto;

Dados() {
    this.valor = 0;
    this.texto = "";
}

public int getValor() {
    return valor;
}

public String getTexto() {
    return texto;
}

public void setValor(int valor) {
    this.valor = valor;
}

public void setTexto(String texto) {
    this.texto = texto;
}

}

e quanto ao que você perguntou é porque você criou uma variável dados com 0 e “a”, e depois alterou os valores dela para para 1 e “b”, quando você altera os valores ela atualiza em todos lugares, pois a referência ao objeto é a mesma, para corrigir você tem de instanciar uma nova variável dados conforme abaixo.

public static void main(String[] args) {
    int indice = 0;
    Dados dados = new Dados();
    ArrayList<Dados> array = new ArrayList();
    dados.setValor(0);
    dados.setTexto("a");
    array.add(indice, dados);
    indice++;
    dados = new Dados();
    dados.setValor(1);
    dados.setTexto("b");
    array.add(dados);

    System.out.println("Valor: " + array.get(0).getValor() + " Texto:  " + array.get(0).getTexto() + "Indice: " + 0);
    System.out.println("Valor: " + array.get(1).getValor() + " Texto:  " + array.get(1).getTexto() + "Indice: " + 1);
}

espero ter ajudado.

@Thiago_Tolentino você está usando o mesmo objeto, um ArrayList não armazena os dados e sim uma referencia do objeto, tente fazer da seguinte foma:

Dados dados1 = new Dados();
dados1.valor = 0;
dados1.texto = "a";

Dados dados2 = new Dados();
dados2.valor = 1;
dados2.texto = "b";

Ou uma nova instância do objeto:

Dados dados = new Dados();
dados.valor = 0;
dados.texto = "a";

dados = new Dados();
dados.valor = 1;
dados.texto = "b";

Ou um array de Dados:

Dados[] dados;
dados = new Dados[2];
dados[0].valor = 0;
dados[0].texto = "a";

dados[1].valor = 1;
dados[1].texto = "b";

Uma simples maneira de você entender isso seria eliminando essa sua a linha abaixo de:

dados.setTexto(“b”);

elimine essa linha, e teste seu código

array.add(indice, dados)

Vai perceber que mesmo não adicionando o objeto ao array, o valor dele vai mudar.

1 curtida

Saquei, esqueci que arraylist só passa a referência.
No caso a cada adição eu instancio um objeto novo, vou testar aqui e te falo se foi, mas creio que sim.