gpt4 book ai didi

java - 方法调用 : Collections. emptyList() 在不同情况下显示不同的行为?

转载 作者:行者123 更新时间:2023-11-29 06:49:59 24 4
gpt4 key购买 nike

根据 Collections.emptyList() 方法的注释它返回一个空的不可变列表。

直接赋值给对象是合理的。示例:

public class ImmutableList {
public static void main(String[] args){
List<String> namesList=Collections.emptyList();
String[] names = {"Name1", "Name2", "Name3"};
namesList.addAll(Arrays.asList(names));
}

private List<String> getList() {
String[] names = {"Name1", "Name2", "Name3"};
return Arrays.asList(names);
}
}

如果我们运行上面的程序,它会抛出以下异常

Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.add(AbstractList.java:148)
at java.util.AbstractList.add(AbstractList.java:108)
at java.util.AbstractCollection.addAll(AbstractCollection.java:344)
at org.learn.list.ImmutableList.main(ImmutableList.java:11)

但是,如果我们将一个方法的输出分配给这个变量,那么它就可以正常运行。示例:

public class ImmutableListTest2 {
public static void main(String[] args){
List<String> namesList=Collections.emptyList();
ImmutableListTest2 ce = new ImmutableListTest2();
namesList = ce.getList();
namesList.forEach(System.out::print);
}

private List<String> getList() {
String[] names = {"Name1", "Name2", "Name3"};
return Arrays.asList(names);
}
}

输出:

Name1Name2Name3

我的问题是 namesList 在任何情况下都应该是不可变的。为什么我们能够在第二种情况下改变这个变量。

它应该在所有情况下抛出 UnsupportedOperationException。任何帮助表示赞赏。谢谢!

最佳答案

namesList不是一成不变的。原文List<String>它引用的(由 Collections.emptyList() 返回)是不可变的。

namesListList<String>的变量类型。因此,您可以为其分配对任何 List<String> 的引用。实例,可变与否。当您分配给它时 Listce.getList() 返回,它不再引用不可变的 List .

如果你想阻止这种情况,将其设置为 final变量,这将防止它被重新分配:

final List<String> namesList=Collections.emptyList();

关于java - 方法调用 : Collections. emptyList() 在不同情况下显示不同的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51725132/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com