Java:我应该使用哪种类型作为可调整大小的基本类型列表?

4
我想要一个可调整大小的byte列表对象,实现以下接口:
  • 获取当前大小
  • 清空列表(将大小重置为零)
  • 在末尾添加byte
  • 从末尾删除byte
  • 通过索引获取任何元素的值
此外,已知该列表永远不需要容纳超过21个元素。
我已经将此对象实现为大小为21的byte[]数组和一个int,它给出了下一个未填充元素的索引,并且使用它取得了巨大成功。
这似乎是一个简单的实现,但Java是否已经有内置类型来处理这种情况?我想象这样的需求非常普遍。我尝试使用ArrayList<Byte>,但速度非常慢,我的运行时间随着迭代呈指数级增长。我是否正在遭受装箱/拆箱性能损失?应该使用哪种内置类型作为我的基本可调整大小的列表?

2
LinkedList<Byte>怎么样?对于前四个条款来说,它是最好的选择。 - Andrew Tobilko
2
@AndrewTobilko:如果在他们的使用情况下ArrayList<Byte>很慢,我无法想象LinkedList<Byte>会更好。 - T.J. Crowder
你可以使用 java.nio.ByteBuffer - Jesper
1
ArrayList在末尾添加元素的摊销成本虽然比不上LinkedList的O(n),但由于其O(1)的索引访问,因此更加值得使用。 - user2390182
2
我没有尝试过,但eclipse collections有一些本地集合。我对缺乏本机元素的列表感到惊讶。由于性能问题,我还编写了自己版本的ArrayList,使用int命名为IntList。有时候装箱/拆箱会带来严重的性能问题。 - matt
显示剩余10条评论
3个回答

2

如果允许使用外部库,可以使用HPPC(Java的高性能原始集合)。 它支持所有Java原语的列表,集合和映射。

在满足这些要求时,您将不得不做出妥协。建议找到最常用的操作,并根据其选择支持结构。


1
fastutil更好。 - leventov

1

就像其他人已经说过的那样,标准Java不支持原始集合。如果您愿意使用第三方库,Eclipse Collections MutableByteList 将支持您指定的要求列表。

MutableByteList byteList = ByteLists.mutable.empty();
Assert.assertEquals(0, byteList.size());
byteList.add((byte) 1);
byteList.add((byte) 2);
byteList.add((byte) 3);
Assert.assertEquals(3, byteList.size());
byteList.removeAtIndex(2);
Assert.assertEquals(
    ByteLists.mutable.with((byte) 1, (byte) 2), byteList);
byteList.addAtIndex(2, (byte) 3);
Assert.assertEquals(
    ByteLists.mutable.with((byte) 1, (byte) 2, (byte) 3), byteList);
Assert.assertTrue((byte) 2 == byteList.get(1));
byteList.clear();
Assert.assertEquals(0, byteList.size()); 

注意:我是 Eclipse Collections 的提交者。

0

标准Java不提供原始类型的集合。

但编译器为您执行许多自动装箱操作,并且有一些很好的辅助方法,因此从byte[]List<Byte>的转换编码方面可能并不需要太多工作。

但似乎您碰到了这样的代码的一个大问题:它会带来性能成本。但是这无法通过在这种泛泛而谈的层面上进行评估。

长话短说:如果您的环境允许您转向推荐的第三方库之一...只需尝试它们。否则,您必须了解您的CPU周期来自何处:

a)通过分析

或者

b)通过广泛的审查(如果您身边有一些眼力敏锐的同事,请向他们展示您的代码;然后您尝试找出(解)装箱发生的位置以及如何避免它)

如果“内部审查”对您不起作用,则可以转向codereview.stackexchange.com


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接