【问题标题】:Java subList with list size as fromIndex and toIndex列表大小为 fromIndex 和 toIndex 的 Java 子列表
【发布时间】:2016-09-14 18:34:02
【问题描述】:

因此,如果我有一个大小为 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 size || fromIndex > toIndex) 引发 IndexOutOfBoundsException。这意味着如果 fromIndex == toIndex && toIndex == size,则不会抛出异常。

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

【问题讨论】:

  • 你用什么实现 List 测试?
  • 我为 ArrayList 试过这个
  • 但是您没有访问第四个元素,所以没有问题。您正在第三个元素之后创建空白空间的子列表。 subList(2, 2) 将创建元素 2 和 3 之间空白空间的子列表。这一切都很好。现在subList(4, 4) 会失败,因为当没有元素 4 时,你无法到达元素 4 之后的空白区域。
  • 看看原始源代码永远不会有坏处。 Here's ArrayList。请注意,虽然subList(3,3) 可以工作,但subList(4, 4) 应该会失败,因为toIndex > size

标签: java


【解决方案1】:

答案在documentation you already linked 中显而易见。见第一段。特别要注意括号中的短语(我用粗体表示):

返回此列表在指定之间的部分的视图 fromIndex(包括)和 toIndex(不包括)。 (如果 fromIndex 和 toIndex 相等,返回列表为空。) 返回列表为 由这个列表支持,所以返回列表中的非结构性变化 都反映在此列表中,反之亦然。返回列表支持 此列表支持的所有可选列表操作。

由于您为 fromIndextoIndex 传递了相同的值,因此即使索引超出了原始列表的范围,您从中得到的列表也是空的。

【讨论】:

    【解决方案2】:

    参考这个。

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

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

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

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

      • 如果端点索引乱序(fromIndex > toIndex)

    所以,在你的情况下 fromIndex = 3 不大于 size(3)。 也不大于 toIndex (3)

    【讨论】:

    • IndexOutOfBoundsException??虚假地,你读过OP的论点吗?
    • @CommonMan OP 是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 2020-05-05
    • 2013-01-14
    • 1970-01-01
    • 2016-04-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多