一个集合在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); } } }