最终的ArrayList是什么意思?

MyT*_*tle 61 java final arraylist

通过使ArrayList(或其他Collection)最终获得哪些优点/缺点?我仍然可以添加ArrayList新元素,删除元素并更新它.但是什么影响使它成为最终的?

NPE*_*NPE 123

但是什么影响使它成为最终的?

这意味着您无法重新绑定变量以指向其他集合实例:

final List<Integer> list = new ArrayList<Integer>();
list = new ArrayList<Integer>(); // Since `list' is final, this won't compile
Run Code Online (Sandbox Code Playgroud)

作为一种风格问题,我声明大多数我不打算改变的引用final.

我仍然可以添加ArrayList新元素,删除元素并更新它.

如果您愿意,可以使用Collections.unmodifiableList()以下方法阻止插入,移除等:

final List<Integer> list = Collections.unmodifiableList(new ArrayList<Integer>(...));
Run Code Online (Sandbox Code Playgroud)

  • +1使用final字段可以提高清晰度,因为类可能很长.我没有在方法中使用final,因为我试图分解长方法. (4认同)

ada*_*shr 14

它只是意味着您无法重新分配其引用.尝试执行类似下面的操作将导致编译器错误.

final List<String> list = new ArrayList<String>();

list = new LinkedList<String>();
     ^
     Compiler error here
Run Code Online (Sandbox Code Playgroud)

如果您真的想要一个不可变列表,则应该使用该Collections.unmodifiableList()方法.


Mic*_*gue 8

例如,您将无法修改其引用new ArrayList.


rsp*_*rsp 5

创建变量final可确保在分配后不能重新分配该objest引用.如您所述,您仍然可以使用该列表方法进行更改.

如果将final关键字与Collections.unmodifiableList结合使用,则可以实现您可能尝试实现的行为,例如:

final List fixedList = Collections.unmodifiableList(someList);
Run Code Online (Sandbox Code Playgroud)

这导致fixedList无法更改指向的列表.但要注意它仍然可以通过someList引用进行更改(因此请确保在此对齐后它超出范围.)


小智 5

final 在多线程下会产生很多后果.

  1. JMM明确定义了final字段的初始化完成是有保证的.

什么没有明确定义是:

  1. 编译器可以跨内存屏障对它们进行重新排序.
  2. 编译器始终可以读取缓存副本.