在不触发垃圾回收的情况下对二维数组执行Arrays.sort



这段代码运行得很好,但不幸的是,由于Arrays.sort()Comparator,它触发了垃圾收集。

有没有一种方法不会触发垃圾回收?

(注意:此代码已被修改为更"通用"。实际代码适用于Android游戏,这就是为什么垃圾回收导致的速度减慢是一个问题。)

static final byte INCOME = 0;
static final byte INDEX = 1;
public void vSortEmployees() {
    nPaidEmployees = 0;
    for (nIter=0; nIter<MAX_EMPLOYEES; nIter++) {
        if ((employees[nIter].current == true) && (employees[nIter].volunteer == false)) {
            // We have another current and paid employee; add that employee's "amount earned to date" to the list.
            paidemployees[nPaidEmployees][INCOME] = employees[nIter].fGetTotalIncomeToDate();
            paidemployees[nPaidEmployees][INDEX] = nIter;
            nPaidEmployees++;
        }
    }
    Arrays.sort(paidemployees, new Comparator<float[]>() {
        @Override
        public int compare(float[] f1, float[] f2) {
            if (f2[INCOME] < f1[INCOME]) 
                return -1;
            else if (f2[INCOME] > f1[INCOME])
                return 1;
            else
                return 0;
        }
    });
    // Now we have a list of current, paid employees in order of income received.
    // Highest income paid out
    paidemployees[0][INCOME]
    // Second highest income paid out
    paidemployees[1][INCOME]
    // If we need to reference the original employee object, we can:        
    employees[paidemployees[0][INDEX]].getName();
}

没有办法一致地触发或不触发GC。GC过着自己的生活。它在对数组进行排序时运行,这并不意味着什么。

但是不管怎样,你还是可以做点什么的。只是不要使用比较器的匿名内部类。你其实并不需要这个。使用正则类并将其对象创建为singleton。然后使用这个实例。在这种情况下,在排序期间不会在代码中创建新对象,GC可能不会运行。

class FloatArrayComparator implements Comparator<float[]>() {
    @Override
    public int compare(float[] f1, float[] f2) {
        if (f2[INCOME] < f1[INCOME]) 
            return -1;
        else if (f2[INCOME] > f1[INCOME])
            return 1;
        else
            return 0;
    }
};

class SomeClass {
    private Comparator<float[]> floatArrayComparator = new FloatArrayComparator();
    void myMethod() {
         Arrays.sort(myArray, floatArrayComparator);
    }
}

相关内容

最新更新