代码之家  ›  专栏  ›  技术社区  ›  Computerish

将整数转换为字符串而不分配内存

  •  7
  • Computerish  · 技术社区  · 15 年前

    当垃圾回收器运行时,我的Android游戏偶尔会出现延迟。我运行了DDMS,发现应用程序分配的所有内存都来自这一行:

    scoreString = String.valueOf(score);
    

    在不分配任何内存的情况下,将整数转换为字符串的最佳方法是什么?

    2 回复  |  直到 15 年前
        1
  •  12
  •   Doug Moscrop    15 年前

    分配一个要显示为分数的字符数组,并使用一个0-9的查找表(这很方便地映射到一个0基数组)根据分数的每个数字追加到此数组。

    编辑: 要从分数中提取数字:

    12345 mod 10 = 5
    12345 mod 100 = 45 / 10 = 4.5 (floors to 4)
    12345 mod 1000 = 345 / 100 = 3.45 (floors to 3)
    12345 mod 10000 = 2345 / 1000 = 2.345 (floors to 2)
    12345 mod 100000 = 12345 / 10000 = 1.2345 (floors to 1)
    

    此外,您还将知道score字符数组的最大长度应基于用于存储score的任何内容(即int)

    我建议反向填充此数组并将其初始化为所有“0”,这样您的分数将显示为

    0000000000
    0000005127
    
        2
  •  0
  •   Tanoh    12 年前

    我也遇到了这个问题,如果GC在一个帧中启动,它真的很明显。我想出了这个解决办法。

    如果你向后填充缓冲区,你可以重复 % 10 / 10 .

    将数字附加到StringBuilder的工作实现,可能不是最好的方法,但它可以工作并且不会导致分配。您也可以使用另一个字符数组作为值,而不是强制转换为char并添加48(ascii中的'0')

        private char[] sbBuffer = new char[20];
    private void appendInt(StringBuilder sb, int num) {
        int i,j;
        i = sbBuffer.length - 1;
        if (num == 0) {
            j = sbBuffer.length - 1;
            sbBuffer[j] = (char) 48;
        } else {
            if (num < 0)
                sb.append('-');
            num = Math.abs(num);
            while (num > 0) {
                sbBuffer[i] = (char) (num % 10 + 48);
                i--;
                num /= 10;
            }
            j = i + 1;
        }
    
        sb.append(sbBuffer, j, sbBuffer.length - j);
    
        /* clean up */
        for (i = j; i < sbBuffer.length; i++)
            sbBuffer[i] = 0;
    }