Почему мой метод add перезаписывает вектор? - PullRequest
1 голос
/ 07 ноября 2008

Я добавляю объекты в Java-вектор, используя его метод add (Object). В моем примере первые 5 объектов идентичны, за ними следуют 2 экземпляра, отличных от первых пяти. По некоторым причинам, как только я вставляю первый, который отличается, он заменяет весь вектор на это значение!

'values' - это итератор, содержащий что-то вроде '1', '1', '1', '1', '1', '2', '2'


Vector temp = new Vector();    
while (values.hasNext()) {
     temp.add(values.next());
     System.out.println(temp.toString());
}

Будет выведено что-то вроде

[1]
[1,1]
[1,1,1]
[1,1,1,1]
[1,1,1,1,1]
[2,2,2,2,2,2]
[2,2,2,2,2,2,2]

Я пытался использовать LinkedList, а также использовать add (объект, индекс). То же самое произошло.

Ответы [ 2 ]

10 голосов
/ 07 ноября 2008

Я подозреваю, что каким-то образом «объекты», которые вы получаете от итератора, на самом деле являются множественными ссылками на один экземпляр изменяемого объекта, который меняет свое состояние с «1» на «2». Единственное, о чем я не могу догадаться, как это меняет состояние в этой явно однопоточной операции.

Можете ли вы опубликовать более полный код? Покажите, откуда взято values и как оно инициализировано.

2 голосов
/ 07 ноября 2008

Следующая программа скомпилирована и работает под Mac OS X

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

 public class Test{ 

     public static void main( String ... args ){ 
         List list = Arrays.asList(new String[] {"1","1","1","1","1","2","2"});
         Iterator values = list.iterator();
         Vector temp = new Vector();    
         while (values.hasNext()) {
              temp.add(values.next());
              System.out.println(temp.toString());
         }
     } 
 } 

дал следующие результаты:

[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 2]
[1, 1, 1, 1, 1, 2, 2]

Так что вы можете предоставить полную реализацию, особенно ваш итератор. И я просто должен это сказать, но вы действительно не должны использовать Вектор!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...