当前位置: 首页 > 知识库问答 >
问题:

当没有匹配的元素时,为什么要列出#indexof返回-1?

谭骏
2023-03-14

最近,我正在阅读Java集合框架的源代码,注意到了List#indexOf方法。

在这个方法的Javadoc中,它说“返回指定元素在这个列表中第一次出现的索引,或者如果这个列表不包含该元素,-1。

我很好奇为什么它应该返回-1确切地说...仅仅返回一个负数就足以满足要求,以下是我的观点:

  1. 比较数字是否为负比比较数字是否为-1容易。
    (确定数字是否为负只能比较符号位)
  2. 如果允许为“未找到元素”返回负值,则可能有助于优化某些特殊的数据结构。

我已经在谷歌上搜索过了,但似乎没有人有和我一样的困惑……
谢谢你的回答:),我是一个Java的呆子&所以……

共有1个答案

胡锋
2023-03-14

比较一个数字是否为负数比比较一个数字是否为-1更容易

你想错了。考虑波斯特定律:

接受的东西要自由,送的东西要保守。

并将其应用于API设计。

你可以自由地写:

if (list.indexOf(something) < 0) ....

它每次都起作用,因为-1是一个负数。

将API写成“任何负数”有什么可能呢?

让我们一起来了解一下:

>

  • 它在文档中建议API的用户应该编写<0而不是!=-1-但这并不是一个很大的论点:您最多可以这样说,文档可以说尽管始终返回-1,但API的用户应该使用<0进行检查。但这是荒谬的:正确的检查方法是根本不调用indexof而是调用.contains()

    它使编写调用.indexof代码变得更加容易。这是false-您可以同样编写<0。在需要索引稳定的地方,可能会出现这种情况(假设您将一些数据存储在java.util.map 集合中,您的过程是在列表中查找某个键以计算id(一个整数),然后将其映射,您还需要将“key not found”映射到某个东西。如果.indexOf()被指定为返回任何负数以表示未找到,则您必须将该数据“清除”为-1,但您不必这样做,它保证为-1。

    它使得编写java.util.list的实现更加容易。这似乎是一个无关紧要的争论(您多久实现一次J.U.List?不像调用它那样每天都发生)。我很怀疑它实际上会导致更短的代码,我真的怀疑代码会更易读。

    那么,有什么可能的点呢?

    记住,这是一个API规范。并不是每一个决策都需要一个解释,除了“我们需要一些特定的东西,因为API的目的是命令公共的规则集”。有时只是选择任何东西就是主要的胜利,在许多相同的选择中选择哪一个并没有多大的关系。只要每个人都同意使用相同的选择,就可以了。这就解释了为什么它是-1,而不是-100或integer.min_value(-2^31)。他们本可以选的。他们没有。-1稍微简单一些(编写-1要比integer.min_value简单一些,它是“第一个”负值,并且在某种程度上与已建立的约定相匹配,例如各种C库返回-1表示未找到。

  •  类似资料:
    • 我是AWS的新手,我正在尝试通过Lambda更新DynamoDB中的一个item属性。我尝试了Node.JS和Python中的代码,两次尝试都返回: 模块初始化错误:调用UpdateItem操作时发生错误(ValidationException):提供的键元素与架构不匹配 为什么会发生这种情况?这是我的表格信息: 表名:高端假日拍卖 主分区键:Aliyah_ID(字符串) 主排序键:最高投标人(字

    • 当我使用System.out.println静态方法时,下面的Java程序显示ArrayList中的所有元素。但是,当我在方法中返回列表时,它只显示ArrayList中的一个元素。我希望你能给我一些指点,让我知道你做错了什么:

    • 问题内容: public class ReturnTest { public static void main(String[] args) { ReturnTest rt = new ReturnTest(); rt.show(); } 在上面的代码中,该show()方法返回一个String未被 任何变量捕获的值。编译器和JVM均不会引发任何警告, 错误或异常。对于原始返回类型也是如此。 为什么

    • 如果我们假设有如下所示的XML,那么match=“/”究竟返回什么?据我所知,它返回了一个虚构的顶级节点,它具有<代码> 测验xml

    • 目前,我正在与Selenium合作,尝试使用Chrome中的“Inspect”正确识别元素。在某些情况下,我单击的某些按钮仅由类定义,但使用“”驱动程序无法找到某些类。find_element_by_class_name''。 下面是我从Chrome上用Inspect获得的代码的和平: 我需要单击“导入费用”按钮,该按钮是“x-btn文本menu_import2”类的一部分。我不能在这里使用XPA

    • 问题内容: 我不明白为什么这个简单的正则表达式匹配不返回匹配对象。它返回None我在做什么错? 我完全是newby(昨天开始),想编写一个小程序来搜索文件夹树中的某些文件,打开这些文件并在这些文件中找到某些行,然后将这些行打印到一个新文件中。为了完成第一步,我想匹配os.walk返回的文件名,并使用某种模式进行匹配。因此,现在我正在检查正则表达式的工作方式,并且据我所知,以下代码应该匹配,但是当我