我们可以使用add
/ remove
方法将List
/ add()
个元素转移到remove()
,而无需创建与{{1}类似的其他列表} StringBuffer
。所以我认为append()
是可变的。谁能证实我的理解是正确的?如果有错,请用以下代码解释
List
答案 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
是可变的,并且未在List
或add()
上创建另一个remove()
实例。
如果您正在寻找不可变列表 - 请检查Guava
或ImmutableList的java.lang.UnsupportedOperationException
实施,这会导致修改{{1}}。