是的,我搜索并找到了类似问题的相似答案,但没有以下问题:
为什么?
是否存在任何真正的原因-性能,协方差或其他原因-为什么Java Array没有indexOf方法?
-
看来这个问题无法回答。 除非其中一位语言设计人员碰巧入迷,否则谁将不知道为什么该特定的所需方法未包含在API中? 遗漏的原因不在JLS中。 构造自己的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中就位),因此您可以立即了解到该操作将很昂贵。
-
"因为它很方便"。 Scala和.NET都将数组作为"适当的"集合类型进行了更好的集成-实现细节就是一个细节。这只是Java真正表明其原始性的一个领域。
-
@pst,他对这个问题的回答是,数组是为基于索引的访问而创建的。因此,无论您是否同意不为数组包含indexOf()方法的决定,我都非常怀疑extraneon是否可以为您更改Java规范。您需要向别人抱怨。 :)而且供您参考,大多数人都会同意您的观点,即有比Java语言更好的语言(Scala,C#等)。
-
@Bigwheels"为什么会有indexOf?"是我的评论所涉及的。使用数组代替具有相同性能特征的ArrayList或其他一些类似的数据结构(假定大小固定)是一种实现细节(哎呀,如果感觉不错,Java甚至可以隐藏"数组语法")。尽管可能不是最佳的数据结构,但从数组中排除这种"能力"是愚蠢的-是的,我很清楚它被排除在外了。
-
@pst,可能有很多不方便的方法,这些方法不属于语言提供的构造(例如数组)。与其被主动"排除在外",可能还没有包括在内。绝对没有必要。
-
@Atreys与.NET或Scala中的数组进行比较。这种人为的划分没有理由-与原始函数所施加的划分非常相似。这是Java方式。但是,这并不意味着这是唯一的方法或正确的方法。
-
@pst生病了,我是.NET和Scala的新手;我之间的比较(链接如下:) .NET,Java和Scala使用简单的循环来汇总值似乎说明了Java中的原始数组与基于.NET和Scala的对象数组之间的区别。诚然,我对其他两种语言的经验不足,可能产生了将10000个整数加起来10000次的更差的方法。
-
我同意您的看法,因为我也认为这样做是出于性能方面的考虑。在基于索引的数据结构中,索引of是一项昂贵的操作。
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()是微不足道的并且非常非常快。
-
好吧,O(n)快速-那么为什么不在数组类型上包括这个(其他许多"基本")运算符呢? ("列表"之类的"实际"集合类型还有很多可用的方法。)
-
不,不是O(n)快。恒定时间快。我当然假设,OP正在谈论IndexOf()来查找对对象实例的引用而不是对具有相同属性的对象的引用的数组中的位置(这将是Find()的更多内容) )嗯。观察其他响应,似乎大多数人都在谈论在数组中查找相似对象的索引。那不是我原本认为IndexOf()的目的。
-
喔我的错。我没有想到需要使用Java实现Array集合。我在想,作为基础库的一部分,它可以/将是本地的。没关系。
我的猜测:
1)在Java 5之前(在存在原始类型自动装箱之前),由于数组可能包含原始类型或对象,因此很难决定何时使用==和何时使用equals()。
2)在Java 5之后,indexOf()仍然不存在,可能是因为Pa?lo Ebermann所说的。
除了Pa?lo Ebermann所说的那样,我认为Java语言工程师拒绝的原因是因为他们希望数组像C ++中的数组一样,并且只希望将基本的操作(例如长度)集成为内置的数组操作。 IndexOf()更像是一种实用程序操作,所以我认为这就是为什么它不是内置操作。
他们没有将其称为indexOf(),而是将其称为Arrays.binarySearch()。
我推测开发人员认为,一般的indexOf()会太慢,并且如果线性时间算法合适的话,对于开发人员来说就足够容易编写。 除了在病理情况下,对排序数组的二进制搜索将比普通线性搜索更快,而且对于开发人员来说,第一次正确搜索也不容易。
-
二进制搜索要求对输入进行排序。这样就不一样了。没有理由说" of的索引太慢"(它是O(n))-当然不比标准数组迭代慢。
可能不在规格范围内或被遗忘了。或者,制造商正在发送潜意识的消息(我不知道使用HashSets进行更快的查找)。也许他们想消除图书馆中的冗余...人们只能猜测...
List接口需要indexOf:
http://download.oracle.com/javase/1.5.0/docs/api/java/util/List.html
因此,不要使用简单的数组,而要使用以下之一:
-
摘要清单
-
AbstractSequentialList
-
数组列表
-
属性列表
-
CopyOnWriteArrayList
-
链表
-
角色清单
-
RoleUnresolvedList
-
堆
-
向量
Java数组权衡了性能与功能之间的权衡。做出的牺牲之一是无法使用indexOf方法。
-
真傻添加方法不会增加阵列的运行时开销。虽然indexOf实现本身就是普通的O(n),但有Arrays.binarySearch和List.indexOf,因此更具争议的是Array只是可怜的被遗忘的孩子...
-
我不明白为什么这个答案被赞成。两次。与使用asList和indexOf相比,将此方法添加到库中不会降低性能。两者均为O(n)。