【问题标题】:Java: How to initialize and fill final static ordered Map?Java:如何初始化和填充最终的静态有序 Map?
【发布时间】:2012-03-04 21:12:13
【问题描述】:

我有一个 Java 中的词干提取算法,它需要一个静态的最终 HashMap<String, String> 预先填充大约 30 000 条记录。

我需要地图按照插入的顺序保存记录(我得到提示,我可以使用LinkedHashMap?)。

我想我可以手动在 Java 类文件中插入值,因为这是通过使用 30 000 次调用将它们加载到 RAM 中的最快方法(时间/生产力对这个项目非常重要)

map.put("Key", "Value");

问题是,java(或至少 eclipse)在任何段/方法等中只允许 65kb 的代码。所以我最终扩展了 11 个类并将 65kb 的 .puts 放入构造函数或 static { } .

一切都很好,但是当我运行它时,订单被打乱了。对于这么多行,我无法追踪哪里出了问题,在扩展顺序中还是在地图中。

那么,请告诉我,就性能而言,您在 java 中填写最终地图的最佳方式是什么。

P.S.:从文件中加载和解析记录太慢了...

【问题讨论】:

    标签: java map initialization hashmap


    【解决方案1】:

    一切都很好,但是当我运行它时,订单被打乱了。为此 很多行我无法追踪哪里出了问题,在扩展中 订购或在地图中。

    a) HashMap 不保留插入顺序。请改用LinkedHashMap。 或者,由于您将使用它作为常量,请考虑使用 Guava ImmutableMap。它保留了插入顺序,是不可变的,并提供了一个构建器对象,用于使用许多值来构造它。

    b)

    P.S.:从文件加载记录太慢了...

    为什么?它只会在类加载期间完成一次。而 35K 字符串/字符串对对于现代机器来说确实不是很多数据。

    【讨论】:

    • 是的,我在问题中谈到了这个,但它仍然是乱码。
    • @Tony ...因为一个[可能]需要看看a)(这是“在问题中谈到的” - 所以已经这样做了:-/)而且,它没有何时创建 HashMap 并不重要......这是相同的一次性前期成本。
    • @pst 是的,但是拥有一个包含 35000 行静态初始化的类文件对我来说听起来很糟糕,所以我会选择 b) 自己!
    • @SeanPatrickFloyd 我会先解决这个问题(35k 行静态初始化)......首先。创建单例 Map 或静态 Map 实际上是一回事:它只创建一次。不同之处在于源,它几乎可以是任何东西,从硬编码调用(在上述情况下)到整体字符串(如果你想将它全部保存在“类文件”中),或者 CSV 文件或 SQLite DB什么的。请确保在正确的上下文中运行性能分析,然后再在不清楚的情况下追逐假设的性能提升。 (在这两种情况下,结果都是在堆上创建的等效 Map 对象。)
    • @pst, ImmutableMap 提供插入顺序。即使对于String,我也会在此应用程序中使用ImmutableMap,毫无疑问。也就是说,我永远不会在一百万年内将 30000 行静态初始化放在一个类文件中。加载它。请。
    【解决方案2】:

    您是否考虑过在内存数据库中使用?(例如 HSQLDB)用这么多数据预填充一个类看起来不太合适。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-13
      • 1970-01-01
      • 2014-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-14
      • 1970-01-01
      • 2016-01-08
      相关资源
      最近更新 更多