Java 搜索数组中元素的索引

Java 搜索数组中元素的索引,java,Java,假设我们有一个对象数组,我想在列表中找到一个特定对象的索引,通常我会使用这个方法 public static int findIndex(Object[] arr, Object o) { int index = -1; for (int i = 0; i < arr.length; i++) { if (arr[i].equals(o)) { index = i; break; } }

假设我们有一个对象数组,我想在列表中找到一个特定对象的索引,通常我会使用这个方法

public static int findIndex(Object[] arr, Object o) {
    int index = -1;
    for (int i = 0; i < arr.length; i++) {
        if (arr[i].equals(o)) {
            index = i;
            break;
        }
    }
    return index;
}
公共静态int-findIndex(对象[]arr,对象o){
int指数=-1;
对于(int i=0;i

但是,是否只有使用
java.lang
包才能更快地实现这一点?

如果您希望提高CPU时间的效率,这是最好的。如果您正在寻找更少的代码行,您可以尝试

theIndex = Arrays.asList(arr).indexOf(o); 

或者类似的…

如果集合是有序的,您可以使用二进制搜索,这是一种非常简单的搜索算法

下面是一个Java示例:


如果你对数据的顺序一无所知,那么就没有更有效的算法了,这是理论上的最优。你可以-使用一些技巧-使它快几个百分点。例如:

  • 缓存数组的长度
  • 执行立即返回,而不是中断(就性能而言,中断被认为没有那么有效)
  • 使用
    o.equals
    代替
    arr[i].equals
    。智能编译器可以缓存
    o
    vtable
但编译器很可能已经可以自己派生出一些优化

因此,更有效的算法可能是:

public static int findIndex(Object[] arr, Object o) {
    int n = arr.length;
    for (int i = 0; i < n; i++) {
        if (o.equals(arr[i])) {
            return i;
        }
    }
    return -1;
}
(由于缓存的原因,您首先调用的方法有所不同)。关键是差异并没有那么大,可以通过操作系统调用和其他服务器任务来改变。所以我们可以有把握地说,我们谈论的是毫秒的实际性能差异

但是,如果数据是按顺序排列的,则可以执行


如果要进行多个查找,可以首先在
哈希集中插入元素。这个
HashSet
的平均查找次数为O(1)(给定一个好的散列函数)。

您可以使用如上所述的一行代码。这里也有一些信息

array.indexOf()


您所说的更有效的方法是什么意思?什么对你有效?Java8中有一个懒惰的评估,但是当我用你的方法对它进行基准测试时,你的方法更快了!感谢查看Java 8中的findfirst,并将其与您的方法进行比较,您可以看到您的方法比我测试的更快。您可以用更少的行来完成,但不会更快,除非您对数组内容有所了解。有许多搜索算法,但它们都有自己的假设。例如,如果要对列表进行排序,可以使用bisection.OP来搜索数组,而不是字符串。此链接没有解释使用了什么方法以及如何将其用于数组。@Pshemo抱歉,我读得太快了。说到HashSet,还值得一提的是,如果速度是一个主要问题,那么使用java.lang以外的任何包都可以轻松地开发出相当健壮和高效的哈希表结构。其中一个例子来自《算法》第四版。它导入LinkedList包,但只是作为一种惰性方法,将密钥集作为iterable返回。您可以轻松地创建自己的实现iterable接口的极简通用队列。
//question first
findIndex (question): 4s 209 469 827
findIndex (answer):   4s 078 955 465
//answer first
findIndex (question): 4s 256 345 171
findIndex (answer):   4s 488 112 895