java - Arrays.sort 在不触发垃圾收集的情况下对二维数组进行排序?

标签 java android arrays garbage-collection

此代码运行完美,但不幸的是,由于 Arrays.sort() 比较器,它触发了垃圾回收。

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

(注意:此代码已被修改为更“通用”。实际代码是针对 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 过着自己的生活。它在您对数组进行排序时运行这一事实并不意味着什么。

但是无论如何你都可以做一些事情。只是不要为比较器使用匿名内部类。你真的不需要这个。使用常规类并将其对象创建为单例。然后只使用这个实例。在这种情况下,排序期间不会在您的代码中创建新对象,并且 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);
    }

}

关于java - Arrays.sort 在不触发垃圾收集的情况下对二维数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12434907/

相关文章:

java - 如何使用 JMenuItem 重置 JFrame(重启游戏)?

Java ExecutorService - 创建一个新线程但不启动它

android - 将 iOS、Android 和 Rails 应用程序连接到一个数据库

c++ - 字符串结构体和字符串数组一样吗?

arrays - 多个查询结果在一个结果json

java - 双角字符的 String.format

java - Hibernate 多对多连接表不为继承的实体保留

java - 使用 AppCompat 在 Android 中为按钮着色

android - 如何将源附加到 android.jar

c - 在 C 中对 3d 数组的元素求和