【问题标题】:Try to get the first element from the empty collection [closed]尝试从空集合中获取第一个元素 [关闭]
【发布时间】:2012-03-25 21:59:41
【问题描述】:
public class Demo {

    private final List<E> blah;

    public demo(final List<E> result) {
        super();
        this.blah = Collections.unmodifiableList(result);
    }

    public List<E> getResult() {
        return blah;
    }

    public static void main(final String args[]) {
        final Demo d = new Demo(Collections.EMPTY_LIST);
        System.out.println(d.getResult().get(0));
    }
}

发生了什么以及为什么。什么是转机。?如果我尝试做第 1 行,通用性会丢失吗?

【问题讨论】:

    标签: java collections


    【解决方案1】:

    我认为你的问题在概念上是错误的。

    Collection 的特定位置访问元素是相当奇怪的。这意味着您确定在特定位置上存在特定元素。集合总是一组某种类型的元素。仅访问特定元素,您就可以赋予该特定元素一些特定的含义。使用

    迭代集合是一种很好的做法
    for(Object o: collection){...}
    

    如果您希望从for 中对特定元素(如get(i))进行特定访问,则必须始终检查该元素是否存在。类似的东西

    if(collection.size() > i)
    {
    //do operation
    }
    

    总体思路:您可以使用Map,其中具有特定含义(键)的元素映射到该含义(键)。

    编辑:刚刚检查,EMPTY_LIST 是不可变的,如果您希望能够添加元素(然后使用一些 get(i) 访问它们),您必须像普通列表一样创建它

    final List<String> list = new ArrayList<String>();
    

    【讨论】:

      【解决方案2】:
      final List<String> list = Collections.EMPTY_LIST;
      

      这会创建一个空列表,这意味着它的大小为 0。然后你调用了

      list.get(0)
      

      导致 ArrayIndexOutOfBoundsException

      【讨论】:

        【解决方案3】:

        先测试它是否不为空... EMPTY_LIST 也不是类型安全的。

        final List<String> list = Collections.emptyList();
        if (!list.isEmpty()) {
            System.out.println(list.get(0));
        }
        

        【讨论】:

          【解决方案4】:

          它会抛出 IndexOutOfBoundsException。为什么不测试一下?

          【讨论】:

            猜你喜欢
            • 2021-12-08
            • 1970-01-01
            • 2017-03-11
            • 2013-02-05
            • 2019-07-07
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多