【问题标题】:HashMap with consecutive Integers as keys vs. ArrayList以连续整数为键的 HashMap 与 ArrayList
【发布时间】:2021-12-21 14:19:50
【问题描述】:

我偶然发现了一些代码,它使用HashMap<Integer,HashMap<Integer, String>> 来存储一个通常 >100.000 行和 10 列的大型 Excel 表。列和行都是连续的整数。我肯定会改用ArrayList<ArrayList<String>> 之类的东西。

那么使用HashMap 有什么显着优势吗?您是否发现任何严重的性能问题(无论是内存还是运行时)?

【问题讨论】:

  • 没有。原作者应该使用列表。
  • 地图方法(显然)假设一个稀疏矩阵,因为并非几乎所有单元格都被填充。如果所有单元格都被填满,那么使用地图地图就会产生明显的开销。
  • @Kayaman 您可以在不丢弃迭代顺序的情况下使用 null 实现相同的效果
  • @Kayaman 他说它们是连续整数,这意味着非稀疏。带有键 0,1,2,3,... 的地图只是一个糟糕的列表。
  • @Michael 那么看来判决已经成立了。幸运的是,这些天开发人员的记忆力超过了理智。他们可能从某个地方复制粘贴了代码。

标签: java performance arraylist hashmap


【解决方案1】:

我觉得有必要提供一个答案,但应该归功于@Kayaman,他看到了显而易见的并首先发表了评论。

您正在寻找的显着潜在优势是一般情况下的速度、灵活性和节省空间

假设您有一个 3x3 范围的 9 个单元格,左上角位于单元格 A1,然后在 ZZ49 处添加一个新单元格。对于使用线性分配内存的任何数据结构,您突然需要将内存增长几个数量级(约 30,000 个新的空单元),可能(取决于数据结构)重新排列已存储的单元并初始化大量永不使用的空值(语言/库实现将具有不同的实现细节但类似的浪费缺点)。

Excel 本身是否会保持数组/数组列表的大小以覆盖每个工作表/范围中的每个单元格?不太可能。在您的示例中,单元格的范围可能不会稀疏地填充,但原则上和一般情况下,电子表格中包含数据的单元格数量只是允许的最大矩形区域的一小部分。因此,哈希映射(或“多维哈希映射”)在解决此类映射到 Excel 问题的一般方法中并不是不合理的数据结构选择,尽管您可能有充分的理由在您的特定应用程序中做出不同的选择。

【讨论】:

    【解决方案2】:

    使用表中的属性声明一个类,例如:

    public class anyClass(){
    int grossValue;
    int netValue;
    }
    

    因此您可以将这些数据存储在列表中

    ArrayList<AnyClass>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 1970-01-01
      • 2017-08-14
      • 1970-01-01
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多