为什么 java.util.ArrayList 包中的数据数组是私有的?

And*_*mer 25 java visibility arraylist inner-classes

java.util.ArrayList类中,列表元素的对象数组被定义为包私有:

transient Object[] elementData; // non-private to simplify nested class access
Run Code Online (Sandbox Code Playgroud)

评论指出,这个字段不是私有的原因是在嵌套类中更容易访问。但是,嵌套类可以很好地访问封闭类的私有数据。那么为什么elementData不是私有的呢?后台是否发生了某些事情(例如,在编译时)?

Pez*_*ezo 23

当您从嵌套类访问私有字段时,编译器实际上会生成一个包可见的合成访问器方法,然后将其用于访问。它不能直接访问私有成员,因此为了避免这种间接访问,您可以改为使成员包可见。

这是一个包含更多细节的答案

  • [自jdk-11以来有所不同](/sf/answers/4713815011/) (4认同)

Eug*_*ene 12

那个评论已经过时了。随着这个 JEP的引入,将不再有编译器创建的语法方法;这是在jdk-11.

此更改之前,诸如 之类的高度使用结构的问题ArrayList是调用堆栈中的另一种方法(用于访问该private字段)可能在关键路径中具有很高的成本。为了避免再调用一种方法,您可以声明不带 private.