为了账号安全,请及时绑定邮箱和手机立即绑定

Android SparseArray 值比较

Android SparseArray 值比较

智慧大石 2023-10-12 17:07:14
所以我正在编写一些非常简单的代码,并发现了一个非常意外的行为。所有实现List都Map使用equals节点的方法来比较它们。因此,如果您有一个字符串列表,并且您想尝试获取列表中字符串的索引,则不需要使用相同的对象。例子:List<String> list = new ArrayList<>();list.add("test");int index = list.indexOf("test");System.out.println(index);//returns 0我注意到 Android 的所有 SparseArray 类都使用==而不是equals比较节点。示例方法(LongSparseArray.java):public int indexOfValue(E value) {    if (mGarbage) {    gc();    }for (int i = 0; i < mSize; i++) {    if (mValues[i] == value) {        return i;        }    }        return -1;}因此,如果您有这样的简单代码:LongSparseArray<String> localContacts = new LongSparseArray<>();localContacts.put(2, "test");int index = localContacts.indexOfValue("test");System.out.println(index);这里的索引将返回 -1(如果您不知道如何比较该值,这是非常意外的)。所以我想知道...为什么Android不使用equals?这是更方便和更受欢迎的方式(从 Java 的角度来看)。现在我必须循环遍历 a 的所有值SparseArray并自己比较它们,这会导致更多(不需要的)代码(或者使用 a 会Map导致 Android 性能降低)。
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

查看 的源代码LongSparseArray,似乎该方法确实存在 - 但它是隐藏的(由于某种原因):

/**

* Returns an index for which {@link #valueAt} would return the

* specified key, or a negative number if no keys map to the

* specified value.

* <p>Beware that this is a linear search, unlike lookups by key,

* and that multiple keys can map to the same value and this will

* find only one of them.

* <p>Note also that this method uses {@code equals} unlike {@code indexOfValue}.

* @hide

*/

public int indexOfValueByValue(E value) {

    if (mGarbage) {

        gc();

    }


    for (int i = 0; i < mSize; i++) {

        if (value == null) {

            if (mValues[i] == null) {

                return i;

            }

        } else {

            if (value.equals(mValues[i])) {

                return i;

            }

        }

    }

    return -1;

}

您可以看到所有这些代码实际上所做的就是您在问题中所说的 - 循环遍历所有值,直到找到正确的值,然后返回其索引。


Sparse***我不知道为什么它被排除在公共 API 之外,但在我看来,这是反对使用任何东西的另一点。它们通常太基础,无法满足我的要求。


查看完整回答
反对 回复 2023-10-12
  • 1 回答
  • 0 关注
  • 82 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信