列表大小为fromIndex和toIndex的Java子列表

时间:2016-09-14 18:34:02

标签: java

所以,如果我有一个大小为3的列表,让我们说[0,1,2]并且我尝试访问索引为3的列表元素(list.get(3)),显然它失败了一个超出范围的异常。但是,使用subList方法,如果我尝试:

list.subList(3, 3);

我得到一个空列表作为结果。根据文件:https://docs.oracle.com/javase/7/docs/api/java/util/List.html#subList(int,%20int)。此方法为非法端点索引值(fromIndex< 0 || toIndex> size || fromIndex> toIndex)抛出IndexOutOfBoundsException。这意味着如果fromIndex == toIndex&& toIndex == size,不会抛出任何异常。

直观地说,这似乎不应该是这种情况,因为如果只有三个,你就无法访问列表的第四个元素。那么为什么这样呢?它是为了满足某些用例还是无意的副作用?

2 个答案:

答案 0 :(得分:0)

documentation you already linked中可以清楚地找到答案。见第一段。特别要注意括号中的短语(我加粗了):

  

返回指定列表中此列表部分的视图   fromIndex,inclusive,toIndex,exclusive。 (如果fromIndex和   toIndex相等,返回的列表为空。)返回的列表是   此列表支持,因此返回列表中的非结构更改   反映在此列表中,反之亦然。返回的列表支持   此列表支持的所有可选列表操作。

由于您为-fromIndex传递了相同的subList,因此即使索引超出原始列表的范围,您从中获取的List也将为空。

答案 1 :(得分:0)

请参阅。

Why not IndexOutOfBoundsException on List.subList(size, size)?

  

要考虑API设计师的决定,为什么他们决定这样做   这样,我们可以以String.substring()为例,它具有   相似(相同)的约束。可能允许选择一个空的   字符串/子列表?为此,只会抛出两个异常。

如您所知,在以下情况下会引发异常:

  1. IndexOutOfBoundsException
    • 如果端点索引值超出范围
      (fromIndex <0 || toIndex>大小|| fromIndex> toIndex)
  2. IllegalArgumentException

    • 如果端点索引不正确(fromIndex> toIndex)

所以,就您而言 fromIndex = 3,不大于size(3)。 并且不大于toIndex(3)