严密循环中的String.valueOf(Double)会产生大量垃圾

时间:2013-05-15 22:06:13

标签: java string garbage-collection type-conversion

我有一个函数,每隔几毫秒调用一次需要将double转换为字符数组,字符串或其他存储文本的方法。转换后,它会立即使用Androids“canvas.drawText”函数写入屏幕。目前,我正在使用String.valueOf(doubletype),但每次循环运行时都会分配一个新的String对象。

我想知道是否有另一种方法可以将此双精度转换为字符串或字符串数​​组等,而无需在每次循环运行时分配和收集内存。我错过了一些明显的东西吗?

1 个答案:

答案 0 :(得分:1)

在搜索有效的手势检测代码时,我偶然发现了一个函数,该函数在Google编写的示例程序中将十进制数转换为char数组。它完美地满足了我的需求。

可以在此处找到原始代码:http://developer.android.com/training/gestures/index.html(点击"尝试一下"在右侧下载包含项目的zip文件)

我已经在这里复制了相关功能,以防万一。

private static final int POW10[] = {1, 10, 100, 1000, 10000, 100000, 1000000};

/**
     * Formats a float value to the given number of decimals. Returns the length of the string.
     * The string begins at out.length - [return value].
     */
    private static int formatFloat(final char[] out, float val, int digits) {
        boolean negative = false;
        if (val == 0) {
            out[out.length - 1] = '0';
            return 1;
        }
        if (val < 0) {
            negative = true;
            val = -val;
        }
        if (digits > POW10.length) {
            digits = POW10.length - 1;
        }
        val *= POW10[digits];
        long lval = Math.round(val);
        int index = out.length - 1;
        int charCount = 0;
        while (lval != 0 || charCount < (digits + 1)) {
            int digit = (int) (lval % 10);
            lval = lval / 10;
            out[index--] = (char) (digit + '0');
            charCount++;
            if (charCount == digits) {
                out[index--] = '.';
                charCount++;
            }
        }
        if (negative) {
            out[index--] = '-';
            charCount++;
        }
        return charCount;
    }