如何将长数组保存为反向十六进制数字更快?

时间:2014-06-16 12:39:20

标签: java android performance hex

我最近开始在android平台上开发。我正在研究应用程序和一些线索,我正在查看由他们提供的android的示例音乐应用程序 在应用程序中,在他们保存现在播放列表的地方,他们给出了一个我无法理解的论点。参数和代码如下:

if (full) {
        StringBuilder q = new StringBuilder();

        // The current playlist is saved as a list of "reverse hexadecimal"
        // numbers, which we can generate faster than normal decimal or
        // hexadecimal numbers, which in turn allows us to save the playlist
        // more often without worrying too much about performance.
        // (saving the full state takes about 40 ms under no-load conditions
        // on the phone)
        int len = mPlayListLen;
        for (int i = 0; i < len; i++) {
            long n = mPlayList[i];
            if (n < 0) {
                continue;
            } else if (n == 0) {
                q.append("0;");
            } else {
                while (n != 0) {
                    int digit = (int)(n & 0xf);
                    n >>>= 4;
                    q.append(hexdigits[digit]);
                }
                q.append(";");
            }
        }  

其中

  

mPlayList是数字

的数组

和hexdigits是:

private final char hexdigits [] = new char [] {
        '0', '1', '2', '3',
        '4', '5', '6', '7',
        '8', '9', 'a', 'b',
        'c', 'd', 'e', 'f'
};  

然后“q”会保存在共享偏好中。以类似的方式,他们稍后使用这些hexdigits检索列表。如果有人能解释这段代码的重要性,我真的很感激。我的意思是,这与直接使用long值创建字符串有什么不同。

1 个答案:

答案 0 :(得分:2)

他们在这里做的是一种非常简单的算法,可以尽可能快地扫描数字。对于他们需要做的每个数字:

>>
&
append character looked up from array

然后对每个数字另外一次,他们在最后添加;

这些操作中的每一个都非常快,因此最终的结果是从内存中取出很长时间并以紧凑的形式将其放在一个字符串中,以尽可能快的方式将其放入。

它是反向十六进制,因为最先显示最小数字。

这比Java中内置的通用算法要快,但如果节省很多,我会感到惊讶,除非他们节省了很多这些数字。