用Java制作整数键控映射可以吗?

用Java制作整数键控映射可以吗?,java,map,arraylist,indexing,Java,Map,Arraylist,Indexing,就像标题一样。这样做可以吗: HashMap<Integer, Object> foo = new HashMap<>(); HashMap foo=newhashmap(); 或者有更好的容器允许在任何索引处添加值?当说“更好”时,我的意思是“性能更好”,然后是“内存使用更少” ArrayList bar=new ArrayList(); 添加(10_000,新对象()); A希望在上面的代码中执行类似的操作,但这当然不适用于ArrayList。我想列的清单很少;

就像标题一样。这样做可以吗:

HashMap<Integer, Object> foo = new HashMap<>();
HashMap foo=newhashmap();
或者有更好的容器允许在任何索引处添加值?当说“更好”时,我的意思是“性能更好”,然后是“内存使用更少”

ArrayList bar=new ArrayList();
添加(10_000,新对象());
A希望在上面的代码中执行类似的操作,但这当然不适用于ArrayList。我想列的清单很少;索引是分散的——这就是为什么我考虑的是HashMap而不是ArrayList


问候。

您的问题非常笼统,从您指定的细节来看,HashMap和ArrayList似乎都符合您的要求,您只关心性能。性能有多个方面:

  • 如果您的数据是连续的或分布较小的[即整数在序列中或多或少],那么我会选择ArrayList,因为插入的成本比HashMap要低
  • 如果您的数据有很多扩展,或者如果您要执行大量的删除和插入,那么我会选择HashMap
  • 所以这取决于你的要求

    编辑: 如果数据有很多扩展,那么HashMap就是一种方法。如果使用Array或ArrayList,则由于数据存储之间存在大量间隙,内存消耗将变得很高。HashMap的插入成本高于Array,但由于您对RAM的关注,您应该使用HashMap。

    您正在做的(实际上)是使用HashMap来表示稀疏数组

    这可能是一个合理的实现选择,但其效果取决于您试图实现的内容以及阵列的属性

    如果数组足够稀疏,那么可以使用
    HashMap
    而不是简单的数组来节省内存。然而,与非稀疏数组相比,
    HashMap
    使用的内存大约比数组多一个数量级。除此之外,对
    HashMap
    执行
    get
    put
    操作的速度大约比索引简单数组慢一个数量级


    此外,根据数组的大小和稀疏性,有些表示比
    HashMap
    (例如Android稀疏数组类)使用的空间要少得多,但代价是获取/输出性能不能很好地扩展。

    是的,可以像您描述的那样使用HashMap。例如,可以创建一个“稀疏”数组,这样做没有问题,但是要注意整数不会被排序;如果要对它们进行排序,请使用
    TreeMap
    。如果您正在寻找性能更好的替代方案,GNU-Trove可以提供帮助。我知道我可以做到,但我想问是否有更好的方法:)谢谢@fge,我会看看这个GNU-Trove(尽管我更喜欢内置类:)“更好”是一个主观术语。“更好的”在什么条件下?如果你想使用更少的RAM,考虑使用支持原始的<代码> int <代码>键的TINBOTJECTHASMAP,而不是<代码>整数< /Cord>包装器。我的数据有很多的扩展:)我把这个信息添加到问题中。我会选择HashMap。
    ArrayList<Object> bar = new ArrayList<>();
    bar.add(10_000, new Object());