Могут ли возвращенные итераторы получить доступ к частным массивам в Java? - PullRequest
0 голосов
/ 26 февраля 2019

Я пытаюсь уменьшить объем памяти, используемой в Java-проекте, над которым я работаю, и одна из вещей, на которые я обращаю внимание, - это использование итераторов массивов, а не копий массивов.Тем не менее, я не уверен, будет ли это работать или нет с частными данными внутри объекта.Например:

public class MyClass {
    private ArrayList<String> data;

    public ArrayList<String> getData(){ return this.data; }
    public Iterator getDataIter(){ return this.data.iterator(); }
}

public static void main(String[] args) {
    MyClass c = MyClass();
    ArrayList<String> copyOfData = c.getData();

    Iterator dataIter = c.getDataIter();
}

Как вы можете видеть, в main () я не мог просто перейти на c.data, потому что он закрытый.Однако c.getData () скопирует весь массив.Итак, вот мои вопросы:

  1. Будет ли dataIter иметь возможность перебирать значения в данных, даже если это частная переменная?
  2. Сохранит ли это мне память, потому что яя больше не передаю большие массивы?

1 Ответ

0 голосов
/ 26 февраля 2019

c.getData() будет не скопировать весь массив, по крайней мере, не в том коде, который вы вставили.

Это делает спорные вопросы спорными, но, конечно же, dataIter отлично работает здесь.

Предлагаю вам рассмотреть, как работает модель памяти java.Все не примитивные значения (все объекты) передаются в виде ссылки.this.data - указатель на массив.Если вы вернете его, вы вернете копию указателя, представляющую собой небольшое число (обычно 64-разрядное), которое ссылается на массив.

Вы можете тривиально проверить это: call .getData () иизменить что-то в массиве.Эта модификация также произойдет в MyClass, потому что есть только один массив, с полем data и результатом вызова getData() со ссылкой на этот один массив.

...