尝试从空集合中获取第一个元素

时间:2012-03-08 12:00:46

标签: java collections

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行,那么通用性会丢失吗?

4 个答案:

答案 0 :(得分:2)

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

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

迭代集合是一种好习惯
for(Object o: collection){...}

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

这样的东西
if(collection.size() > i)
{
//do operation
}

一般想法:您可以使用Map,其中具有特定含义(键)的元素被映射到此含义(键)。

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

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

答案 1 :(得分:0)

它会抛出和IndexOutOfBoundsException。你为什么不测试它?

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

final List<String> list = Collections.EMPTY_LIST;

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

list.get(0)

导致ArrayIndexOutOfBoundsException