java.util.List是否可变?

时间:2016-11-05 13:02:09

标签: java

我们可以使用add / remove方法将List / add()个元素转移到remove(),而无需创建与{{1}类似的其他列表} StringBuffer。所以我认为append()是可变的。谁能证实我的理解是正确的?如果有错,请用以下代码解释

List

3 个答案:

答案 0 :(得分:14)

列出可变性

由于List是一个接口,它唯一的承诺是:“这些是你将获得的方法。”

List界面描述了可变列表。请注意,它具有add()set()remove()等功能。但请注意,这些变异器是designated as "optional" operations

存在List接口的实现,这些实现在实践中是不可变的。

List<Integer> mutable = new ArrayList<>();
mutable.add(1);

List<Integer> immutable = Collections.unmodifiableList(mutable);
// try to modify the list
immutable.add(2);
// Exception in thread "main" java.lang.UnsupportedOperationException

Collections.unmodifiableList()会返回List实施Collections.UnmodifiableList的实例。

Collections.UnmodifiableList不可变 List函数的所有调用正确转发给基础List。而它通过抛出List来实现所有可变 java.lang.UnsupportedOperationException函数。

列出元素可变性

如果我们这样做:

List<Date> mutable = new ArrayList<>();
dates.add(new Date());
List<Date> immutable = Collections.unmodifiableList(mutable);
Date myCoolDate = immutable.get(0);

我们可以改变myCoolDate吗?绝对

myCoolDate.setTime(99999); // works! mutates the original Date object in the `List`.

List - 无论是不可变还是其他 - 存储对象的引用副本。一旦我们引用了对象(Date myCoolDate = immutable.get(0);),我们就可以自由地改变对象。

不可变列表中的项目没有不变性保证。它们完全像它们一直一样可变

答案 1 :(得分:6)

是。它是可变的。 如果你想拥有一个不可变的,你可以使用java实用程序集合类来包装它: java.util.Collections中#unmodifiableList

像这样:

  List<Object> mutableList = new ArrayList<>();
  List<Object> immutableList = Collections.unmodifiableList(mutableList);

答案 2 :(得分:5)

是的,java.util.List是可变的,并且未在Listadd()上创建另一个remove()实例。

如果您正在寻找不可变列表 - 请检查GuavaImmutableListjava.lang.UnsupportedOperationException实施,这会导致修改{{1}}。