ArrayList <byte> vs Java中的字符串</byte>

时间:2014-01-21 00:19:44

标签: java string arraylist lzw

我正在实施LZW算法。我已经成功地为字符串和文本文件实现了它,并且我正在修改我的代码以使用二进制文件,例如图像或可执行文件(因为我无法将这些文件作为字符串读取)。

我已使用String类型替换了代码中的ArrayList<Byte>类型。我的代码现在正确压缩和解压缩二进制文件,但它至少慢了10倍!在速度是关键因素的压缩应用中,这是不可接受的。

我是否ArrayList<Byte>正确替换String。有类似功能的更快的替代方案吗?请注意,LZW算法需要调整数组大小,因此标准arrays[]不合适。

问候。

4 个答案:

答案 0 :(得分:6)

使用List<Byte>会将每个字节放入一个单独的对象实例中 总的来说,这是你可以为表现做的最糟糕的事情之一。

相比之下,数组或字符串可以占用一块可靠的内存。

相反,您应该使用ByteArrayOutputStream,或直接使用byte[]并根据需要调整大小(您可以为此创建包装类)

答案 1 :(得分:1)

byte ArrayList内的boxing String,其使用的内存比简单byte多得多。这意味着每个byte []都包含在一个整个对象中,并由引用引用。请注意,这样的引用本身比原始字节大4到8倍!

使用原始{{1}}数组或者原始集合库(将原始数组正确抽象为集合),例如thisthis,你会好得多。

答案 2 :(得分:0)

您需要找到导致速度减慢的代码部分。问题中没有足够的信息来获得任何有用的答案。

您应该使用分析器。请参阅此主题:Which Java Profiling tool do you use and which tool you think is the best?

答案 3 :(得分:0)

ArrayList实现了一个数组,因此不适合进行大量调整。如果调整大小会造成瓶颈,LinkedList应该会提供更好的性能。

https://stackoverflow.com/a/322742/1487030