为什么没有元素匹配时 List#indexOf return -1...?
Why List#indexOf return -1 when no element matching...?
最近,我在阅读 Java Collections Framework 的源代码,注意到 List#indexOf 方法。
在这个方法的Java文档中,它说“Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
”
我很好奇为什么要return-1恰好...只要return一个负数就可以满足要求,这里是我的观点:
- 比较一个数是否为负比比较一个数是否为-1更容易。
(判断一个数是否为负只能比较符号位)
- 如果允许return为“未找到元素”设置负值,这可能对某些特殊数据结构的优化有用。
我在 Google 和 SO 上搜索过,但似乎没有人和我有同样的困惑...
感谢您的任何回答:),我是 Java 的菜鸟,所以...
该方法必须 return 一些否则无效的值。在编写这些 API 时不存在可选项,因此它必须在有效 int
值的 space 范围内。
否则永远不会出现负值,因此该值必须为负数。
如果它 return 是一个特定的无效值,那么它比“任何”(Comparator
/Comparable
,我在看着你)更不容易出错。
但为什么具体是-1?几乎可以肯定是因为他们正在复制 String.indexOf
的行为,而后者复制了 string::find
in C++, which returns string::npos
if not found, whose value is -1.
的行为
在设计 Java 时,对该语言进行了一些调整,使其对 C++ 程序员“更熟悉”,以鼓励他们尝试一下;像这样的小事情意味着您不必努力学习完全不同的语义。
为什么 C++ 设计者选择该值? ... 这可能会持续一段时间。最终,他们需要一个值,他们选择了一个可以接受的值。
程序员应该努力做到懒惰:在制定新约定和使用已经存在的东西之间做出选择,后者通常是更好的选择,除非有真的好理由不。
Compare whether a number is negative is easier than comparing whether a number is -1
你的想法是错误的'side'。考虑 Postel 定律:
Be liberal in what you accept, and conservative in what you send.
并将其应用于API设计。
你可以随意写:
if (list.indexOf(something) < 0) ....
有效,每次,因为-1
是负数。
将 API 写成 'any negative number' 有什么可能的意义?
让我们来看看:
它在文献上建议 API 的用户应该写成 < 0
而不是 != -1
- 但这不是一个很大的争论:充其量你然后可以说文档可以说虽然 -1 总是 returned,API 的用户应该使用 < 0
来检查。除了这很荒谬:正确的检查方法是根本不调用indexOf
而是调用.contains()
。
编写调用.indexOf
的代码更容易。 这是错误的 - 你也可以写成 < 0
。在您需要索引稳定的地方,这可能会发生(假设您将一些数据存储在 java.util.Map<Integer, X>
集合中,并且您的过程是在列表中查找一些键以找出 id(整数),然后将其映射,并且您还需要将 'key not found' 映射到某物。如果将 .indexOf()
指定为 return 任何负数以指示未找到,则您必须'clean'这个数据为-1,但你不必,它保证是-1。
它使编写 java.util.List
的实现变得更容易。这似乎是一个无聊的论点(你多久实施一次 j.u.List?不完全是每天都会发生,不像调用它)。我相当怀疑它实际上会导致更短的代码,而且我真的怀疑代码是否会更具可读性。
那么,有什么可能的点呢?
记住,这是一个 API 规范。并非每个决定都需要解释,因为我们需要一些特定的东西,因为 API 的目的是制定通用规则集。有时只要选择任何东西就是主要的胜利,选择许多相同的选择中的哪一个并不重要。只要每个人都同意使用相同的选秀权,就可以了。这就解释了为什么它是 -1 而不是 -100 或 Integer.MIN_VALUE
(-2^31)。他们本可以选择那个。他们没有。 -1 稍微简单一点(写 -1
比 Integer.MIN_VALUE 简单,它是 'first' 负值,它有点符合既定的约定,例如 return 的各种 C 库-1 表示未找到。
最近,我在阅读 Java Collections Framework 的源代码,注意到 List#indexOf 方法。
在这个方法的Java文档中,它说“Returns the index of the first occurrence of the specified element in this list, or -1 if this list does not contain the element.
”
我很好奇为什么要return-1恰好...只要return一个负数就可以满足要求,这里是我的观点:
- 比较一个数是否为负比比较一个数是否为-1更容易。
(判断一个数是否为负只能比较符号位) - 如果允许return为“未找到元素”设置负值,这可能对某些特殊数据结构的优化有用。
我在 Google 和 SO 上搜索过,但似乎没有人和我有同样的困惑...
感谢您的任何回答:),我是 Java 的菜鸟,所以...
该方法必须 return 一些否则无效的值。在编写这些 API 时不存在可选项,因此它必须在有效 int
值的 space 范围内。
否则永远不会出现负值,因此该值必须为负数。
如果它 return 是一个特定的无效值,那么它比“任何”(Comparator
/Comparable
,我在看着你)更不容易出错。
但为什么具体是-1?几乎可以肯定是因为他们正在复制 String.indexOf
的行为,而后者复制了 string::find
in C++, which returns string::npos
if not found, whose value is -1.
在设计 Java 时,对该语言进行了一些调整,使其对 C++ 程序员“更熟悉”,以鼓励他们尝试一下;像这样的小事情意味着您不必努力学习完全不同的语义。
为什么 C++ 设计者选择该值? ... 这可能会持续一段时间。最终,他们需要一个值,他们选择了一个可以接受的值。
程序员应该努力做到懒惰:在制定新约定和使用已经存在的东西之间做出选择,后者通常是更好的选择,除非有真的好理由不。
Compare whether a number is negative is easier than comparing whether a number is -1
你的想法是错误的'side'。考虑 Postel 定律:
Be liberal in what you accept, and conservative in what you send.
并将其应用于API设计。
你可以随意写:
if (list.indexOf(something) < 0) ....
有效,每次,因为-1
是负数。
将 API 写成 'any negative number' 有什么可能的意义?
让我们来看看:
它在文献上建议 API 的用户应该写成
< 0
而不是!= -1
- 但这不是一个很大的争论:充其量你然后可以说文档可以说虽然 -1 总是 returned,API 的用户应该使用< 0
来检查。除了这很荒谬:正确的检查方法是根本不调用indexOf
而是调用.contains()
。编写调用
.indexOf
的代码更容易。 这是错误的 - 你也可以写成< 0
。在您需要索引稳定的地方,这可能会发生(假设您将一些数据存储在java.util.Map<Integer, X>
集合中,并且您的过程是在列表中查找一些键以找出 id(整数),然后将其映射,并且您还需要将 'key not found' 映射到某物。如果将.indexOf()
指定为 return 任何负数以指示未找到,则您必须'clean'这个数据为-1,但你不必,它保证是-1。它使编写
java.util.List
的实现变得更容易。这似乎是一个无聊的论点(你多久实施一次 j.u.List?不完全是每天都会发生,不像调用它)。我相当怀疑它实际上会导致更短的代码,而且我真的怀疑代码是否会更具可读性。
那么,有什么可能的点呢?
记住,这是一个 API 规范。并非每个决定都需要解释,因为我们需要一些特定的东西,因为 API 的目的是制定通用规则集。有时只要选择任何东西就是主要的胜利,选择许多相同的选择中的哪一个并不重要。只要每个人都同意使用相同的选秀权,就可以了。这就解释了为什么它是 -1 而不是 -100 或 Integer.MIN_VALUE
(-2^31)。他们本可以选择那个。他们没有。 -1 稍微简单一点(写 -1
比 Integer.MIN_VALUE 简单,它是 'first' 负值,它有点符合既定的约定,例如 return 的各种 C 库-1 表示未找到。