覆盖与查找

Tho*_*hle 2 java memory compiler-construction performance vm-implementation

我正在阅读SparseArrayandroid中的类,并遇到了以下方法:

public void removeAt(int index) {
    if (mValues[index] != DELETED) {
        mValues[index] = DELETED;
        mGarbage = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

显然,这也可以写成:

public void removeAt(int index) {      Or   public void removeAt(int index) {
    if (mValues[index] != DELETED) {            mValues[index] = DELETED;
        mValues[index] = DELETED;               mGarbage = true;
        if (!mGarbage)                      }
            mGarbage = true;         
    }                                
}                                    
Run Code Online (Sandbox Code Playgroud)

似乎Android开发人员认为数组查找mValues[index]比数组写入更快,但变量查找并不比变量写入快.

这是真的吗?它取决于VM,还是编译语言的常识?

Jon*_*eet 5

当然右侧版本等同 - 因为无论值是否发生变化,mGarbage都设置为true .

左边相当于原版,但没有意义.

基本上我认为你错过了检查现有值是否允许DELETED的副作用:只有当方法实际上有效时才允许mGarbage设置为true .这与从数组中读取的性能无关.