为什么Java数组没有indexOf方法?

Why do java arrays have no indexOf method?

是的,我搜索并找到了类似问题的相似答案,但没有以下问题:
为什么?

是否存在任何真正的原因-性能,协方差或其他原因-为什么Java Array没有indexOf方法?


因为它没有添加到标准库的Arrays类中,并且JLS没有为数组对象提供indexOf方法。

这可能有用:

1
2
3
String[] someArray = ...;
List<String> l = Arrays.asList(someArray); // see comments
int index = l.indexOf("foo");

快乐的编码。


如果从另一侧看,为什么它们会有indexOf?

indexOf可能是一个昂贵的操作,因为如果数组中填充了Objects,则需要equals()。数组不打算那样使用,而是在API中显示。

我确实相信有限的API会很好地强调实现的优势,而Array的优势是基于索引的访问。

如果您需要快速搜索唯一对象,请使用Set。

使用数组没有错,但是我认为选择具有正确语义的类会使代码更清晰。

顺便说一句,在Arrays中碰巧有一个binarySearch,但是它需要对数组进行排序(可能在Arrays.sort中就位),因此您可以立即了解到该操作将很昂贵。


Java语言工程师拒绝将新方法添加到类库中没有的任何内容中。

因此,数组仅具有.length运算符和.clone()方法,仅此而已。
相反,将许多有用的数组方法添加到类java.util.Arrays中-但没有indexOf方法。

对于引用类型的数组(即对象),您可以使用Arrays.asList(array).indexOf(object),但对于基本数组,则没有此类List包装器。

当然,您可以很容易地自己创建这样的indexOf方法,只需执行许多复制+粘贴即可对所有原始类型进行操作。

1
2
3
4
5
6
7
8
public int indexOf(X[] array, X value) {
    for(int i = 0; i < array.length; i++) {
       if (array[i] == value) {
         return i;
       }
    }
    return NOT_FOUND;
}

(对于基元,将X替换为具体值。对于引用类型,请使用.equals(value)代替== value。)

为什么还没有完成?一些猜测:

  • 这需要O(n)时间(就像在列表中搜索一样),对于较大的对象来说这太慢了
    数组。更好地使用一些数据结构,以便更快地访问。
  • 如果您确实需要它,则可以做错什么,也可以自己在
    "包含"您的数组的对象。

我在这里发现有趣的是,有多少取决于语义:Java中的"数组"是什么意思?我一直都隐含地并且没有充分的理由假定"数组"是相同大小对象的连续块-我怀疑主要是因为这就是它以其他几种语言实现的方式。

显然,这不是Java设计人员用于"数组"的定义,尽管我不知道如果有的话什么都不会丢失。

在定义的情况下,indexOf()是微不足道的并且非常非常快。


我的猜测:

1)在Java 5之前(在存在原始类型自动装箱之前),由于数组可能包含原始类型或对象,因此很难决定何时使用==和何时使用equals()

2)在Java 5之后,indexOf()仍然不存在,可能是因为Pa?lo Ebermann所说的。

除了Pa?lo Ebermann所说的那样,我认为Java语言工程师拒绝的原因是因为他们希望数组像C ++中的数组一样,并且只希望将基本的操作(例如长度)集成为内置的数组操作。 IndexOf()更像是一种实用程序操作,所以我认为这就是为什么它不是内置操作。


他们没有将其称为indexOf(),而是将其称为Arrays.binarySearch()

我推测开发人员认为,一般的indexOf()会太慢,并且如果线性时间算法合适的话,对于开发人员来说就足够容易编写。 除了在病理情况下,对排序数组的二进制搜索将比普通线性搜索更快,而且对于开发人员来说,第一次正确搜索也不容易。


可能不在规格范围内或被遗忘了。或者,制造商正在发送潜意识的消息(我不知道使用HashSets进行更快的查找)。也许他们想消除图书馆中的冗余...人们只能猜测...


List接口需要indexOf:

http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html

因此,不要使用简单的数组,而要使用以下之一:

  • 摘要清单
  • AbstractSequentialList
  • 数组列表
  • 属性列表
  • CopyOnWriteArrayList
  • 链表
  • 角色清单
  • RoleUnresolvedList
  • 向量


Java数组权衡了性能与功能之间的权衡。做出的牺牲之一是无法使用indexOf方法。