Все элементы ArrayList меняются при добавлении нового?

Прежде всего, извинения за невозможность предоставить какой-либо исходный код. Мой проект довольно большой, и связать все было бы нецелесообразно, и я не смог уменьшить масштаб проблемы, которая чрезвычайно раздражает. Я сделаю все возможное, чтобы объяснить это здесь.

Я динамически создаю новые экземпляры класса в каждом цикле в моем коде. Этому экземпляру динамически присваивается пара свойств в цикле, например, name. В конце каждого цикла вновь сгенерированный экземпляр добавляется в ArrayList, содержащийся в другом 3-м классе.

Проблема, однако, заключается в том, что при добавлении нового элемента по какой-либо причине все предыдущие элементы изменяются в соответствии с последним. Я предполагаю, что ArrayList создает ссылку на динамически создаваемый элемент, так что, когда он изменяется, все они меняются, но я не знаю, как это исправить.

Я был бы признателен за любые советы и еще раз извинения за качество этого объяснения. Я опубликую любой фрагмент кода, который вы можете увидеть

По запросу - XmlHandler.java - http://pastebin.com/mGmWt1RD ParsedDataSet.java = http://pastebin.com/k1xb3KBe Content.java = http://pastebin.com/UxiL2f9q

Просто чтобы сократить ваше время понимания - проект читатель epub. XMLHandler вызывается из синтаксического анализатора SAX в другом классе, который не показан. XMLHandler используется 3 разных раза для 3 разных наборов XML, поэтому здесь есть некоторая путаница.

Проблема заключается в ArrayList 'toc'. 'Toc', или TableOfContents, содержит экземпляры Contents, на которые будут ссылаться позже (не показаны). Я пытаюсь передать данные каждый новый экземпляр "Content", а затем передать их в статический ArrayList

2 ответа

Решение

Я видел, как люди сообщали о такой проблеме много раз, и это всегда сводится к следующему: вы фактически не создаете новый экземпляр, а вместо этого используете один и тот же для каждой итерации цикла. Это простая ошибка, особенно если вы работаете с языком с другой семантикой копирования. Есть много разных способов сделать эту ошибку; если вы отредактируете свой вопрос, чтобы показать код цикла, я уверен, что смогу объяснить, что происходит.

Хорошо, теперь, когда вы добавили код: проблема в том, что в "Содержании" все элементы данных помечены как "статические". В Java это означает, что существует одна переменная, общая для всех объектов, т. Е. Переменная имеет одинаковое значение для каждого объекта. Итак, на самом деле вы создаете много объектов Content для помещения в ArrayList, но все они выглядят одинаково! Удалите эти "статические" атрибуты из элементов данных Content, и все будет готово.

ArrayList просто хранит ссылки на элементы. Убедитесь, что ваш код выглядит так:

ArrayList list = new ArrayList<>();
loop(...) {
    MyObject newOne = new MyObject();
    newOne.setXXX(xxx);
    list.add(newOne);
}

Неправильный код:

ArrayList list = new ArrayList<>();
MyObject sameOne = new MyObject();
loop(...) {
    sameOne.setXXX(xxx);
    list.add(sameOne);
}
Другие вопросы по тегам