2014-02-10 5 views
-1

У меня есть ArrayList, к которому добавляются экземпляры StringBuilders. Я столкнулся с чем-то, о чем не помню раньше.Нечеткое поведение с ArrayList

Когда я добавляю stringBuilder к своему списку массивов, он появляется в списке, затем я возвращаю свой Stringbuilder, чтобы начать строить новую строку (она находится внутри цикла), но когда я возвращаю свой StringBuilder, он также стирает строку из ArrayList.

Мне кажется, что ArrayList хранит указатель на объект StringBuilder и фактически не копирует его. Кто-нибудь знает, как обойти это?

ArrayList<StringBuilder> inbox = new ArrayList<StringBuilder>(); 
StringBuilder emailMsg = new StringBuilder(); 

//A loop here with a lot of code then these two lines before it loops back to the top 
inbox.add(emailMsg); 
emailMsg.setLength(0); //inbox goes back to length=0, nothing in the list 
+3

У вас есть только один 'StringBuilder'. В Java нет понятия о неявном копировании объектов, все имеет/передает значение ссылки (указателя). –

+0

@BrianRoach За исключением 'String',' int', 'double',' char' и 'float' – Rainbolt

+0

@John Существует абсолютно ничего, кроме' 'String', и примитивы не могут использоваться как общий тип (и не являются объектами). –

ответ

2

Это будет лучше хранить String сек, сгенерированные StringBuilder вместо или создать новый экземпляр StringBuilder после добавления текущего StringBuilder.

Бывший:

ArrayList<String> inbox = new ArrayList<String>(); 
StringBuilder emailMsg = new StringBuilder(); 

//A loop here with a lot of code then these two lines before it loops back to the top 
inbox.add(emailMsg.toString()); 
emailMsg.setLength(0); 

Последнее:

ArrayList<StringBuilder> inbox = new ArrayList<StringBuilder>(); 
StringBuilder emailMsg = new StringBuilder(); 

//A loop here with a lot of code then these two lines before it loops back to the top 
inbox.add(emailMsg); 
emailMsg = new StringBuilder(); 

ИМО вы должны работать с прежним.

+0

Другими словами, ArrayList не копирует содержимое stringbuilder, это действительно просто указатель? Почему это заслуживает понижения, что не кажется особенно очевидным? – sreya

+0

@sreya есть люди, которые очень строги относительно того, насколько вы должны знать о языке программирования = \ –

+0

@LuiggiMendoza или сколько исследований было сделано, так как это первая причина в всплывающей подсказке «downvote». –

1

Вы получаете это, потому что ссылка на объект StringBuilder добавлена ​​к List. Это означает, что после того, как вы сбросите длину в одном месте, ссылка в List теперь будет указывать на пустой StringBuilder.

Простейшим решением является создание нового объекта StringBuilder перед каждой итерацией.

Смежные вопросы