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

时间:2011-08-03 18:36:50

标签: java arrays

是的,我搜索过类似问题的answers,但不是这个问题: 的为什么吗

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

9 个答案:

答案 0 :(得分:5)

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

这可能很有用:

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

快乐的编码。

答案 1 :(得分:3)

如果从另一方面看,为什么他们有一个indexOf?

indexOf可能是一项昂贵的操作,因为如果数组填充了Objects,它将需要equals()。数组不打算以这种方式使用,它会在API中显示。

我相信拥有有限的API可以强调实现的优势,而Array的优势在于基于索引的访问。

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

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

在阵列中BTW恰好有一个binarySearch,但是它需要对数组进行排序(可能是使用Arrays.sort就地进行排序),这样你就可以立即意识到操作会很昂贵。

答案 2 :(得分:2)

Java语言工程师拒绝为类库中没有的任何东西添加新方法。

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

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

当然,您可以非常轻松地创建这样的indexOf方法,只需要进行大量的复制+粘贴即可为所有基本类型创建。

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)时间(就像在列表中搜索一样),这对于较大的时间来说太慢了 阵列。更好地使用一些允许更快访问的数据结构。
  • 如果你真的需要它,你要么做错了,要么自己编码 “包含”你的数组的对象。

答案 3 :(得分:1)

我的推测:

1)在Java 5之前(在原始类型自动装箱存在之前),很难决定何时使用==以及何时使用equals(),因为数组可能包含基本类型或对象。

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

除了PaŭloEbermann所说的,我认为Java语言工程师抵制的原因是因为他们希望数组在C ++中像数组一样,只想集成基本操作,如长度,作为内置数组操作。 IndexOf()更像是一个实用程序操作,所以我认为这就是为什么它不是内置操作。

答案 4 :(得分:1)

我在这里发现有趣的东西是多少取决于语义:“数组”在Java中意味着什么?我总是隐晦地并且毫无理由地假设“数组”是一个相同大小的对象块 - 我怀疑这主要是因为它是如何用其他几种语言实现的。

显然,这不是Java设计师用于“数组”的定义,但我不知道如果有的话,任何东西都会丢失。

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

答案 5 :(得分:0)

Java阵列在性能与功能之间进行权衡,有利于提高性能。其中一个牺牲是无法使用indexOf方法。

答案 6 :(得分:0)

List<E>接口需要indexOf:

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

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

  • AbstractList的
  • AbstractSequentialList
  • 的ArrayList
  • 的AttributeList
  • 的CopyOnWriteArrayList
  • 链表
  • 的RoleList
  • RoleUnresolvedList
  • 堆栈
  • 矢量

答案 7 :(得分:0)

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

答案 8 :(得分:0)

他们没有称之为indexOf(),他们称之为Arrays.binarySearch()

我推测开发人员认为一般indexOf()太慢,如果线性时间算法合适,开发人员就可以轻松写入。除了在病态情况下,对排序数组进行二进制搜索比纯线性搜索更快,并且开发人员第一次没有那么容易。