是的,我搜索过类似问题的answers,但不是这个问题: 的为什么吗
有没有任何真正的原因 - 性能,协方差或其他 - 为什么Java Array没有 indexOf 方法?
答案 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
。)
为什么还没有完成?一些猜测:
答案 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
因此,不要使用简单的数组,而是使用以下之一:
答案 7 :(得分:0)
可能它不符合规格或被遗忘。或者,制造商正在发送潜意识消息(使用HashSets进行更快速的查找,我不知道)。也许他们想要消除图书馆的冗余......人们只能猜测......
答案 8 :(得分:0)
他们没有称之为indexOf()
,他们称之为Arrays.binarySearch()
。
我推测开发人员认为一般indexOf()
太慢,如果线性时间算法合适,开发人员就可以轻松写入。除了在病态情况下,对排序数组进行二进制搜索比纯线性搜索更快,并且开发人员第一次没有那么容易。