这个Java算法如何更快

Pie*_*ard 2 java algorithm binary ascii linked-list

我有这个循环,它将布尔的LinkedList拆分为8位,并返回缓冲区中每个字节的ASCII值.该函数返回字符串缓冲区.

如果LinkedList的大小很大,此代码非常慢.我尝试Iterator用简单的循环来改变它,但它仍然很慢.

这个算法怎么能真快?也许有多线程?

注意: linkedList的大小并不总是被8整除.

public String toString(){

        String buffer = "";
        String output = "";

        LinkedList<Boolean> bits = this.bits;

        for(Iterator it = this.bits.iterator(); it.hasNext();){
            if(buffer.length() >= 8){
                output += (char)Integer.parseInt(buffer, 2);
                buffer = "";
            }

            buffer += ((Boolean)it.next() == false) ? "0" : "1";
        }

        if(buffer != "")
            output += (char)Integer.parseInt(buffer, 2);

        return output;
}
Run Code Online (Sandbox Code Playgroud)

Ara*_*ram 8

这些建议将为您提供足够的性能,同时保持代码简单易读.首先使用这些更改进行测试,如果不符合您的性能要求,请慢慢引入其他答案中建议的优化技术

  1. BitSet而不是LinkedList<Boolean>
  2. StringBuilder output;而不是String output;
  3. StringBuilder buffer;而不是String buffer;
  4. Integer.valueOf()而不是Integer.parseInt.valueOf我认为使用缓存值低于128.


axt*_*avt 7

  1. 使用StringBuilder初始化的预期容量输出:

    StringBuilder out = new StringBuilder(bits.size() / 8 + 1);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 使用按位运算代替parseInt(),如下所示:

    int i = 0;          
    int c = 0;
    for(Boolean b: bits){
        if (i > 0 && i % 8 == 0){
            out.append((char) c);
            c = 0;
        }
        c = (c << 1) | (b ? 1 : 0);
        i++;
    }
    out.append((char) c); // Not sure about the desired behaviour here
    
    Run Code Online (Sandbox Code Playgroud)