有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

arraylist Java:我应该使用什么类型作为可调整大小的原语列表?

我想要一个对象,它是一个可调整大小的byte列表,实现以下接口:

  • 获取当前大小
  • 清除列表(将大小重置为零)
  • 在末尾添加一个byte
  • 从末尾删除一个byte
  • 通过索引获取任意元素的值

此外,众所周知,此列表不需要包含超过21个元素

我已经将这个对象实现为一个数组,大小为21的byte[],以及一个int,它给出了下一个尚未填充的元素的索引,并且使用它非常成功

这似乎是一个简单的实现,但java是否已经有了这类东西的内置类型?我想这种事情的必要性是极其普遍的。我尝试使用ArrayList<Byte>,但它非常慢,而且我的运行时随着迭代次数呈指数级扩展。我是否遭受装箱/拆箱性能损失?我应该使用哪种内置类型作为可调整大小的灵长类动物列表


共 (3) 个答案

  1. # 1 楼答案

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

    在处理这些要求时,你必须做出妥协。我建议找到最常用的操作,并据此选择支撑结构

  2. # 2 楼答案

    标准Java不提供任何基元类型的集合

    但是编译器为你做了很多自动装箱;而且有很好的助手方法,所以从byte[]List<Byte>可能不需要太多工作

    但你似乎发现了这样的代码的一个大问题:它带来了性能成本。但这不能通过在这样一个通用的层面上讨论来评估

    长话短说:如果您的环境允许您使用推荐的第三方库之一。。。试试看。如果没有,您必须了解CPU周期的来源:

    a)通过分析

    或者

    b)通过广泛的审查(如果你身边有一些目光敏锐的同事——向他们展示你的代码;然后你试图找出(联合国)拳击比赛发生的地方;以及如何避免)

    如果“内部审查”不适合你,你可以求助于codereview。斯塔克交换。com

  3. # 3 楼答案

    正如其他人已经说过的,标准Java不支持原始集合。如果您对第三方库开放,Eclipse Collections^{}将支持您指定的需求列表

    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集合的提交者