最近,我正在阅读Java集合框架的源代码,注意到了List#indexOf方法。
在这个方法的Javadoc中,它说“返回指定元素在这个列表中第一次出现的索引,或者如果这个列表不包含该元素,-1。
”
我很好奇为什么它应该返回-1确切地说...仅仅返回一个负数就足以满足要求,以下是我的观点:
我已经在谷歌上搜索过了,但似乎没有人有和我一样的困惑……
谢谢你的回答:),我是一个Java的呆子&所以……
比较一个数字是否为负数比比较一个数字是否为-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返回的文件名,并使用某种模式进行匹配。因此,现在我正在检查正则表达式的工作方式,并且据我所知,以下代码应该匹配,但是当我