Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将整数转换为字符串而不分配内存_Java_Android_Memory Management - Fatal编程技术网

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

Java 将整数转换为字符串而不分配内存,java,android,memory-management,Java,Android,Memory Management,当垃圾收集器运行时,我的Android游戏偶尔会出现延迟。我运行了DDMS,发现应用程序分配的所有内存都来自以下行: scoreString = String.valueOf(score); 在不分配任何内存的情况下,将整数转换为字符串的最佳方法是什么?分配一个字符数组作为分数显示,并使用0-9的查找表(这方便地映射到0基数组)根据分数的每个数字追加到此数组 编辑: 要从分数中提取数字,请执行以下操作: 12345 mod 10 = 5 12345 mod 100 = 45 / 10 = 4.

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

scoreString = String.valueOf(score);

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

分配一个字符数组作为分数显示,并使用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) 12345模10=5 12345模块100=45/10=4.5(楼层至4层) 12345模块1000=345/100=3.45(楼层至3层) 12345 mod 10000=2345/1000=2.345(楼层至2层) 12345 mod 100000=12345/10000=1.2345(楼层至1) 此外,您还将知道分数字符数组的最大长度应基于存储分数的内容(即int)

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

0000000000 0000005127 0000000000 0000005127
我也遇到了这个问题,如果GC在一个帧中启动,它真的会被注意到。我想出了这个解决办法

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

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

private char[]sbBuffer=new char[20];
私有void appendInt(StringBuilder sb,int num){
int i,j;
i=sbBuffer.length-1;
如果(num==0){
j=sbBuffer.length-1;
sbBuffer[j]=(char)48;
}否则{
if(num<0)
某人附加('-');
num=Math.abs(num);
while(num>0){
sbBuffer[i]=(字符)(数量%10+48);
我--;
num/=10;
}
j=i+1;
}
sb.append(sbBuffer,j,sbBuffer.length-j);
/*清理*/
对于(i=j;i
这真的是唯一的办法吗?考虑到这需要大量的数学运算,我不能完全确定这是否比分配内存更快。这段代码在一个循环中,每秒被调用多次。当然,我怀疑它的数学性比碰撞检测和响应所需的数学性要低,或者比游戏中需要的任何其他机制都要低,从而需要经常更改分数?听起来像是你显示事物的方式是这里的问题。如果垃圾收集器或字符串分配真的干扰了你的游戏,你还有其他严重的问题需要掩盖。你能解释一下吗?垃圾收集器可能是Android游戏中最常见的性能问题。另外,除了在短时间内(不到一秒钟)减速外,性能也不错。从日志输出来看,这些延迟与垃圾收集是一致的。
    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;
}