一个集合在Java中最终是什么意思?

在Java中将集合声明为final是什么意思? 是不是可以添加更多元素? 是否已经存在的元素无法改变? 还有别的吗?

不。它只是意味着参考不能改变。

final List list = new LinkedList(); .... list.add(someObject); //okay list.remove(someObject); //okay list = new LinkedList(); //not okay list = refToSomeOtherList; //not okay 

您在最终不可变对象之间感到困惑。

final – >您无法更改对集合(Object)的引用 。 您可以修改引用指向的集合/对象。 您仍然可以向集合中添加元素

immutable – >您无法修改引用指向的Collection / Object的内容。 您无法向集合中添加元素。

你不能这样做,参考是FINAL

  final ArrayList list = new ArrayList(); ArrayList list2 = new ArrayList(); list=list2;//ERROR list = new ArrayList();//ERROR 

JLS 4.12.4

一旦分配了最终变量,它总是包含相同的值。 如果最终变量包含对对象的引用,则可以通过对对象的操作来更改对象的状态,但该变量将始终引用同一对象。

使变量最终确保在分配后不能重新分配该对象引用。 如果您将final关键字与Collections.unmodifiableList结合使用,那么就可以了解行为

 final List fixedList = Collections.unmodifiableList(someList); 

这导致fixedList指向的列表无法更改。 它仍然可以通过someList引用进行更改(因此请确保在此asignment之后它超出范围。)

更简单的例子是使用彩虹类在hashset中添加彩虹的颜色

  public static class Rainbow { /** The valid colors of the rainbow. */ public static final Set VALID_COLORS; static { Set temp = new HashSet(); temp.add(Color.red); temp.add(Color.orange); temp.add(Color.yellow); temp.add(Color.green); temp.add(Color.blue); temp.add(Color.decode("#4B0082")); // indigo temp.add(Color.decode("#8A2BE2")); // violet VALID_COLORS = Collections.unmodifiableSet(temp); } /** * Some demo method. */ public static final void someMethod() { Set colors = RainbowBetter.VALID_COLORS; colors.add(Color.black); // <= exception here System.out.println(colors); } } }