返回的迭代器可以访问Java中的私有数组吗?

时间:2019-02-25 23:40:22

标签: java iterator

我正在尝试减少正在处理的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是私有变量,dataIter仍可以遍历数据中的值吗?
  2. 这样做会不会为我节省任何内存,因为我不再传递大型数组了?

1 个答案:

答案 0 :(得分:1)

c.getData()复制整个数组,至少不会复制到您粘贴的代码中。

这使其余问题无济于事,但可以肯定的是,dataIter在这里工作正常。

我建议您回顾一下Java的内存模型如何工作。所有非原始值(所有对象)都以引用形式传递。 this.data是指向数组的指针。如果返回它,则返回该指针的副本,该副本是一个较小的数字(通常为64位),它指向数组。

您可以对此进行简单的测试:调用.getData(),然后修改数组中的内容。该修改也将发生在MyClass中,因为只有一个数组,同时包含data字段以及调用getData()引用此数组的结果。