Java 列表:实例化时赋值和实例化后赋值的区别

Java Lists: Difference between assignment while instantiating and after

只有当我在实例化后为 arrayList 赋值时才会发生此错误。 This is the Error

只有当代码是这样的时候才会出现这种情况:

String line = scanner.nextLine();
line = line.replaceAll("[^A-Za-z]", " ");
line = line.toLowerCase();
List<String> words = new ArrayList<String>();
words = Arrays.asList(line.split(" "));
words.removeAll(Arrays.asList("", null));
System.out.println(Arrays.toString(words.toArray()));

当代码如下时,程序运行正常:

String line = scanner.nextLine();
line = line.replaceAll("[^A-Za-z]", " ");
line = line.toLowerCase();
List<String> words = new ArrayList<String>(Arrays.asList(line.split(" ")));
words.removeAll(Arrays.asList("", null));
System.out.println(Arrays.toString(words.toArray()));

感谢任何类型的进一步解释和建议:)

This error only occurs when I assign values to an arrayList after it has been Instantiated.

那不是你在这里做的:

List<String> words = new ArrayList<String>();
words = Arrays.asList(line.split(" "));

您正在将空的 ArrayList 分配给 words,然后将由 Arrays.asList(line.split(" ")) 创建的另一个 List 分配给 words。第二个 List 是固定大小的 List,因此您不能从中删除元素。

没有必要将 words 初始化为一个空的 ArrayList,如果稍后您为它分配一个不同的 List

如果要使用初始化 words 变量的 ArrayList,请对第二条语句使用 addAll

List<String> words = new ArrayList<String>();
words.addAll(Arrays.asList(line.split(" ")));
words = Arrays.asList(line.split(" "));

问题是这一行 - Arrays.asList() 创建了一个 不可变的 列表,之后你不能添加/删除项目