仅仅因为 对 列表 的引用 是不可变的,并不意味着 它所引用 的列表是不可变的。
即使这样
list做
final了也可以
// changing the object which list refers toexample.getList().add("stuff");但这 不是 允许的:
// changing listexample.list = new ArrayList<String>(); // assuming list is public
为了使列表不可变(也防止第一行),建议您使用
Collections.unmodifiableList:
public class Example { final private ArrayList<String> list; Example(ArrayList<String> listArg) { list = Collections.unmodifiableList(listArg); }}(请注意,这将创建列表的不可修改视图。如果有人坚持使用原始参考,则仍可以通过该列表来修改列表。)
使用字符串,此行为是不可能的。 那么这里有什么区别?
这是因为a
String已经是不可变的(无法修改),就像将列表变成unmodifiableList一样。
比较:
String data structure | List data structure.-------------------------+------------------------------------.Immutable | String | Collection.unmodifiableList(...) |-----------+-------------------------+------------------------------------|Mutable | StringBuffer | ArrayList |'-------------------------+------------------------------------'



