【发布时间】:2017-06-19 02:45:33
【问题描述】:
我需要用 Java 重写一些多年前编写的 C++ 代码。
在 C++ 中,我使用 std::vector<unsigned char> buffer 来实现一个缓冲区,我将从套接字连接中检索该缓冲区。
使用这个缓冲区,我可以进行各种操作:
- 有一个迭代器来缓冲元素并根据需要推进它。
- 搜索某些令牌。
- 使用索引/迭代器从缓冲区中获取一系列字节元素(子缓冲区)。
基于这些要求,我可以使用ArrayList<Byte> 并拥有一个自定义的类似迭代器的类来跟踪当前元素并使用索引工作。
在哪些方面使用List<Byte>会效率低?
我在其他地方看到过ByteBuffer 被推荐,但我的要求并不需要它。
也许是因为我需要索引、执行搜索等,而且我的缓冲区一旦创建就不会更改或修改。
我只需要读取缓冲区并执行上述操作。
我是否应该更好地使用我自己的迭代器/指针类对 byte[] 进行包装?
【问题讨论】:
-
ArrayList不需要自定义的类似迭代器的类,因为有一个类,您可以使用iterator()获得它(或者您可以在Java 8+ 中使用stream())。如果您不提前知道缓冲区大小,首选ArrayList,ByteBuffer更快更高效(但需要您知道大小)。 -
问题是我无法将迭代器向前推进 10 到 20 步(使用循环似乎很糟糕),这就是为什么我认为我可以只使用索引编写一个自定义的。由于我根本没有修改缓冲区并且需要进行搜索,所以
ByteBuffer似乎也没有必要。 -
不,说真的,使用
ByteBuffer。不管您需要什么操作,ArrayList<Byte>的效率都会低得令人尴尬。修改、搜索什么的,都没关系。 -
@LouisWasserman:我猜是因为它包含对
Byte对象的引用,这些对象在堆上随机分布,而ByteBuffer包含连续字节? -
它们可能不是随机分布的,,但是任何额外的堆间接寻址都比你需要的成本要高得多。