代码之家  ›  专栏  ›  技术社区  ›  S Kumar

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

  •  1
  • S Kumar  · 技术社区  · 6 年前

    根据评论 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
    

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

    它应该扔 UnsupportedOperationException 在所有情况下。 如有任何帮助,我们将不胜感激。谢谢!

    1 回复  |  直到 6 年前
        1
  •  6
  •   Eran    6 年前

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

    名称列表 是的变量 列表<字符串> 键入。因此,您可以将对任何 列表<字符串> 实例,是否可变。当您分配给它时 List 返回者 ce.getList() ,它不再引用不可变的 列表 .

    如果你想阻止它,就把它 final 变量,它将阻止重新分配:

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