2017-02-20 25 views
0

Возвращает ли ArrayList.get (index) только значение элемента по индексу или указатель на этот элемент? Я спрашиваю, потому что это не так, как я ожидаю егоArrayList.get() возвращает указатель не значение?

List<List<Integer>> myList; 
myList = new ArrayList<>(Collections.nCopies(n, new ArrayList<>())); 
      . 
      . 
      . 
List tempList = this.myList.get(x); 
tempList.add(i); 
this.myList.set(i,tempList); 

Вместо добавления элемента массива с индексом х и хранения нового списка с индексом я, это добавление элемента в обоих местах поэтому вместо списка, увеличивающегося по размеру, я получаю n раз последний элемент

+0

Вы читали http://stackoverflow.com/questions/40480/is-java-pass-by-reference-or-pass-by-value?rq=1? Посмотрите, отвечает ли это на ваш вопрос. –

+0

ВСЕ переменные Java типа объекта являются ссылками, которые очень похожи на указатели. –

+0

Я искал, но не видел этого, спасибо –

ответ

1

Вы ищете неправильное место.

Там нет абсолютно ничего плохого в этом коде:

List tempList = this.myList.get(x); 
tempList.add(i); 
this.myList.set(i,tempList); 

за исключением того, что оно может быть сокращено до этого:

List tempList = this.myList.get(x); 
tempList.add(i); 

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

Ваша проблема здесь:

myList = new ArrayList<>(Collections.nCopies(n, new ArrayList<>())); 

Если посмотреть на реализацию Collections.nCopies() вы увидите, что он внутренне использует специальный список, который содержит только один элемент, элемент, который вы дали, и независимо от того, какой индекс вы запрашиваете, его возвращает вам тот же оригинальный элемент.

Итак, у вас нет n списков для начала; у вас есть только один список.

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

  • Нет связанных вопросов^_^