2016-03-03 4 views
0

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

ArrayList<MyClass> list = new ArrayList<Myclass>(); 
MyClass mc = new MyClass(); 

for(int i=0;i<someNumber;i++){ 
    String s = new String(Integer.toString(i)); 
    mc.setString(s); 
    list.add(mc); 
} 

После этого, когда я печатаю свой список, строка для каждого элемента из списка такая же.

Я понимаю, что если я делаю list.add(new Myclass(s);, работает правильно, но мне нужно каждый раз создавать новый экземпляр MyClass? Если someNumber велико, требуется слишком много памяти. Спасибо

+0

Вы просто мутируете тот же 'mc', созданный до ввода цикла, и повторно добавляете его в список. Поэтому в конце он содержит несколько ссылок на один объект (все еще 'mc'), который имеет свойство' string' как последнее назначенное. –

ответ

3

Вы повторно добавляете тот же самый элемент в список. Попробуйте:

List<MyClass> list = new ArrayList<>(someNumber); 


for(int i=0;i<someNumber;i++){ 
    String s = new String(Integer.toString(i)); 
    MyClass mc = new MyClass(); // create new object mc 
    mc.setString(s); 
    list.add(mc); // add the new object to the list 
} 

К тому же объекту, я имею в виду тот же указатель на объект, вы должны создать новый указатель (инициализировать новый класс), чтобы добавить его в список как отдельный экземпляр. В этом случае вы устанавливаете другое значение в setString на одном и том же объекте и умножаете объект в списке.

+0

Спасибо. Но если someNumber как 10 000, он занимает 700 МБ RAM ... Есть ли другой способ? –

+0

@ ЂрђеЂашић где вы получили этот 700 МБ? Мы не знаем, как большой MyClass. И если вы хотите создать новый объект, вам необходимо выделить их –

+0

. Я забыл удалить импорт из MyClass. Благодарю. –

2

Вам необходимо перенести экземпляр объекта mc внутри цикла.

ArrayList<MyClass> list = new ArrayList<Myclass>(); 


for(int i=0;i<someNumber;i++){ 
    MyClass mc = new MyClass(); 
    String s = new String(Integer.toString(i)); 
    mc.setString(s); 
    list.add(mc); 
} 
Смежные вопросы