Создание массива с изменяемым типом данных

#java #mutable

Вопрос:

 **Initializing an array of NaturalNumbers with values 1 through 4**
 

Когда я отлаживаю, я нахожу массив = [5,5,5,5], и моя цель состоит в том, что массив = [1,2,3,4].

         NaturalNumber[] array = new NaturalNumber[4];
        NaturalNumber count = new NaturalNumber2(1);
        for (int i = 0; i < array.length; i  ) {
            array[i] = count;

            count.increment();
 

Вот ссылка на все методы, которые можно использовать с натуральными числами. Я просто не понимаю, как я могу создать нужный массив, не изменив count его значение.

http://web.cse.ohio-state.edu/software/common/doc/index.html?components/naturalnumber/NaturalNumber.html

Комментарии:

1. Вам абсолютно неизбежно придется сделать копии ценности.

2. Вы должны создать объект в цикле for, а не снаружи.

Ответ №1:

  NaturalNumber[] array = new NaturalNumber[4];
        NaturalNumber count = new NaturalNumber2(0);
        for (int i = 0; i < array.length; i  ) {

            count = new NaturalNumber2(i);
            count.increment();
            array[i] = count;
 

Ответ №2:

 **Initializing an array of NaturalNumbers with values 1 through 4**
 

Вы можете сделать это и таким образом

 int[] numbers = IntStream.range(1, 5).toArray();
 

Ответ №3:

У вас получилось 5,5,5,5, потому что вы используете упакованный непримитивный тип вместо примитива.

Таким образом, ссылки-это ссылки NaturalNumber count на местоположение объекта. Когда вы помещаете это count в массив, вы помещаете ссылку (четыре копии), и она содержит последнее значение. Поскольку вы делаете приращение как самое последнее в последнем цикле, оно указывает на значение 5 (но не является значением 5).

Если бы вы объявили int count вместо этого и использовали count , так как вы не можете вызвать .increment () примитив, то вы получили бы последовательность 1, 2, 3, 4. Механизм времени выполнения будет каждый раз помещать фактическое значение count в массив.