Преобразовать целое число в строку без выделения памяти - PullRequest
7 голосов
/ 22 ноября 2010

У меня возникали случайные задержки в моей игре для Android, когда запускается сборщик мусора. Я запустил DDMS и обнаружил, что вся память, выделяемая моим приложением, взята из этой строки:

scoreString = String.valueOf(score);

Каков наилучший способ преобразовать целое число в строку без выделения памяти?

Ответы [ 2 ]

12 голосов
/ 22 ноября 2010

Выделите массив символов, который будет отображаться в виде оценки, и используйте таблицу поиска 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)

Также вы будете знать, какая максимальная длина для массива символов счета должна быть основана на том, что вы используете для хранения счета(т.е. int)

Я рекомендую заполнить этот массив в обратном порядке и инициализировать его всеми «0», чтобы ваш счет отображался как

0000000000
0000005127
0 голосов
/ 22 февраля 2014

Я тоже столкнулся с этой проблемой, если GC включается во время кадра, это действительно заметно. Я придумал это решение.

Если вы заполняете буфер в обратном направлении, вы можете просто несколько раз % 10 и / 10.

Работающая реализация, которая добавляет число в StringBuilder, вероятно, не лучший способ сделать это, но это работает и не вызывает выделений. Вы также можете использовать другой массив символов для значений вместо преобразования в char и добавления 48 ('0' в ascii)

    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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...