java 不可变列表实际上意味着不可调整大小吗?
Does java immutable list actually mean non-resizable?
令人惊讶的代码:
List<Integer> list = Arrays.asList(1, 3, 2);
list.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(list); // prints [1, 2, 3]
不会在我的代码中抛出 UnsupportedOperationException
。但是列表被修改了。
所以我的问题是:我是做错了什么还是可以修改immutable
?但是它不能调整大小。(所以这个不可调整大小的名字不是更好的名字吗?)
编辑:当然是不可变的
好吧 List
在 java 中是可变的,所以它可以被改变,这意味着我们可以通过直接访问它作为赋值语句的一部分来改变列表中的项目。
如果你想制作一个不可修改的列表,你应该检查 Collections
class
中的 public static <T> List<T> unmodifiableList(List<? extends T> list) {
方法
这是一个例子
List<Integer> list = Arrays.asList(1, 3, 2); // you have created a mutable List
list.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(list); // prints [1, 2, 3]
List<Integer> list2 = Collections.unmodifiableList(list);
list2.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(list); // throws UnsupportedOperationException
是的,它们是 non-resizable
如果我们尝试在我们的不可修改列表中添加一个新值,它将抛出 UnsupportedOperationException
list2.add(3);// throws UnsupportedOperationException
Arrays.asList()
没有说“不可变”或“不可修改”。它只声明列表是固定大小的。您仍然可以更改元素,但不能添加任何元素,因为必须调整列表的大小。 @Typhon 的回答为您提供了有关不变性的详细信息。
package Whosebug;
import java.util.Arrays;
import java.util.List;
public class FixedSize {
public static void main(final String[] args) {
final List<String> fsl = Arrays.asList("A", "B", "C");
System.out.println("List before change: " + fsl.size());
for (final String i : fsl) {
System.out.println("\t" + i);
}
try { // this will fail
fsl.add("1");
System.out.println("Did not fail for some strange reason");
} catch (final Exception e) {
System.out.println("Fails as expoected");
}
fsl.set(1, "LOL");
System.out.println("List after change: " + fsl.size());
for (final String i : fsl) {
System.out.println("\t" + i);
}
}
}
令人惊讶的代码:
List<Integer> list = Arrays.asList(1, 3, 2);
list.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(list); // prints [1, 2, 3]
不会在我的代码中抛出 UnsupportedOperationException
。但是列表被修改了。
所以我的问题是:我是做错了什么还是可以修改immutable
?但是它不能调整大小。(所以这个不可调整大小的名字不是更好的名字吗?)
编辑:当然是不可变的
好吧 List
在 java 中是可变的,所以它可以被改变,这意味着我们可以通过直接访问它作为赋值语句的一部分来改变列表中的项目。
如果你想制作一个不可修改的列表,你应该检查 Collections
class
public static <T> List<T> unmodifiableList(List<? extends T> list) {
方法
这是一个例子
List<Integer> list = Arrays.asList(1, 3, 2); // you have created a mutable List
list.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(list); // prints [1, 2, 3]
List<Integer> list2 = Collections.unmodifiableList(list);
list2.sort(Comparator.comparingInt(Integer::intValue));
System.out.println(list); // throws UnsupportedOperationException
是的,它们是 non-resizable
如果我们尝试在我们的不可修改列表中添加一个新值,它将抛出 UnsupportedOperationException
list2.add(3);// throws UnsupportedOperationException
Arrays.asList()
没有说“不可变”或“不可修改”。它只声明列表是固定大小的。您仍然可以更改元素,但不能添加任何元素,因为必须调整列表的大小。 @Typhon 的回答为您提供了有关不变性的详细信息。
package Whosebug;
import java.util.Arrays;
import java.util.List;
public class FixedSize {
public static void main(final String[] args) {
final List<String> fsl = Arrays.asList("A", "B", "C");
System.out.println("List before change: " + fsl.size());
for (final String i : fsl) {
System.out.println("\t" + i);
}
try { // this will fail
fsl.add("1");
System.out.println("Did not fail for some strange reason");
} catch (final Exception e) {
System.out.println("Fails as expoected");
}
fsl.set(1, "LOL");
System.out.println("List after change: " + fsl.size());
for (final String i : fsl) {
System.out.println("\t" + i);
}
}
}