Geração de Numero Aleatório para Matriz

Estou implementando uma função que gera TAM*TAM números aleatórios e os salva em uma matriz, preciso usar ArrayList de ArrayList portanto estou instanciando a variavel linha toda vez que crio uma nova linha e passo essa linha para o ArrayList

    public static ArrayList<ArrayList<Integer>> matrizDeNumeros;


    public static void preencherMatriz() {
        Random numero = new Random();
        ArrayList<Integer> linha = new ArrayList<Integer>();

        if (TAM != 0) {
            matrizDeNumeros = new ArrayList<ArrayList<Integer>>(TAM);
            for (int i = 0; i < TAM; i++) {
                linha = new ArrayList<Integer>(); // // linha.clear(); limpa linha
                
                for (int j = 0; j < TAM; j++) 
                    linha.add(numero.nextInt(rangeNumerosAleatorios));
                
                matrizDeNumeros.add(linha);
            }
         }

    }

minha dúvida é porque é que quando eu uso linha.clear() no lugar de linha = new ArrayList<Integer>(); eu não obtenho o mesmo resultado ??

Não declare as variáveis como ArrayList, declare utilizando a interface e não a classe concreta.

List<List<Integer>> matrizDeNumeros;

Quando você faz linha.clear() está removendo os elementos da sua lista linha, mas o objeto da lista continua sendo o mesmo.

Note que a cada linha você chama o matrizDeNumeros.add(linha), então se você fizer somente o linha.clear(), estará limpando a lista correspondente à linha e também estará adicionando sempre o MESMA lista em cada linha da matrizDeNumeros, por isso a caada linha você tem que instanciar uma nova lista e não limpar o conteúdo da lista existente.

1 curtida