ArrayList<Byte> 与 Java 中的字符串

Posted

技术标签:

【中文标题】ArrayList<Byte> 与 Java 中的字符串【英文标题】:ArrayList<Byte> vs String in Java 【发布时间】:2014-01-21 00:19:44 【问题描述】:

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

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

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

问候。

【问题讨论】:

你应该展示你的代码,性能下降可能还有其他明显的原因。 【参考方案1】:

使用List&lt;Byte&gt; 会将每个字节装箱到一个单独的对象实例中。 总的来说,这是您可以为性能做的最糟糕的事情之一。

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

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

【讨论】:

+1 “固态内存块”可能是这里的关键。像压缩这样的计算密集型操作可能会从增加的内存局部性中受益匪浅。【参考方案2】:

你是boxingbytes 在一个ArrayList 中,它比简单的Strings 使用更多的内存。这意味着每个byte 都包装在一个完整的对象中,并由引用引用。请注意,这样的引用本身比原始字节大 4 到 8 倍!

最好使用原始byte [] 数组,或者使用原始集合库(将原始数组正确抽象为集合),例如this 或this。

【讨论】:

【参考方案3】:

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

您应该使用分析器。看到这个帖子:Which Java Profiling tool do you use and which tool you think is the best?

【讨论】:

【参考方案4】:

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

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

【讨论】:

如果内存位置是罪魁祸首(我怀疑),LinkedList 的性能会更差。 当我在问题中提到调整大小时。我的意思是相当于 String = String + char;所以 ArrayList.add(byte);

以上是关于ArrayList<Byte> 与 Java 中的字符串的主要内容,如果未能解决你的问题,请参考以下文章

Java - ByteBuffer 或 ArrayList<Byte>?

java中,如何在二维的ArrayList中添加List

在带有整数数组的 ArrayList 上使用 contains

java中如何让byte[]与string类型转换后,保持不变

冒泡排序

如何使用reverse方法反转ArrayList的所有元素?