存储每个会话都需要但永远不会改变的数据的最佳方式
Best way to store data that will be needed every session, but will never change
我有一个包含大约 150 个条目的键和相应值的列表。我有一种方法可以在每个会话中多次访问它,但永远不会编辑它。它将在会话与会话之间保持不变。我想因为我想快速访问这些值,所以我会使用哈希图,但我不确定如何长期存储它。最好的存储方式是什么,然后在我的程序开始时访问它。谢谢!
从来没有从来没有?在这种情况下,您应该考虑在程序的 jar 中构建一个属性(或 JSON 等)文件。然后您可以使用
new Properties(getClass().getResourceAsStream());
从与属性文件处于同一包级别的任何 class 获取键值对集。
如果实际上它偶尔会发生变化,您可能需要考虑某种外部数据存储,正如我所看到的,已经在回复您问题的评论中提到过。
如果它实际上永远不会改变,你不妨将它存储在静态初始化class:public static final
中。如果我们假设它 永远不会 会发生变化,那么就没有理由通过其他技术(例如从文件或数据库加载)轻松进行更改。
将其存储为具有 150 个条目的 HashMap 还是 class 中的 150 个字段取决于您。我认为这取决于您想如何访问数据。如果您将它存储为 HashMap,那么您可能会访问 String 键上的值,例如Constants.getData("max.search.results")
。如果将其存储为 150 个字段,则只需直接访问这些字段,例如Constants.MAX_SEARCH_RESULTS
.
至于性能,150个条目你不用担心,除非你的数据很大。人们通常将 HashMap 用于数千或数百万条目。
至于何时初始化,Java中的static
字段只在应用程序启动时初始化一次。对于 150 个条目,这应该不到一毫秒(大概估计)。
另见
- Class for constants
- HashMap performance
您似乎可以对其进行硬编码,例如使用地图 String -> String:
public final class CONST
{
public static final Map<String, String> DATA;
static
{
final Map<String, String> data = new HashMap<>(200);
data.put("key001", "value001");
// ...
data.put("key150", "value150");
DATA = Collections.unmodifiableMap(data);
}
}
这会在加载 class 时创建散列 table。如果你出于某种原因想避免这种情况,你也可以使用 initialization-on-demand holder idiom
我有一个包含大约 150 个条目的键和相应值的列表。我有一种方法可以在每个会话中多次访问它,但永远不会编辑它。它将在会话与会话之间保持不变。我想因为我想快速访问这些值,所以我会使用哈希图,但我不确定如何长期存储它。最好的存储方式是什么,然后在我的程序开始时访问它。谢谢!
从来没有从来没有?在这种情况下,您应该考虑在程序的 jar 中构建一个属性(或 JSON 等)文件。然后您可以使用
new Properties(getClass().getResourceAsStream());
从与属性文件处于同一包级别的任何 class 获取键值对集。
如果实际上它偶尔会发生变化,您可能需要考虑某种外部数据存储,正如我所看到的,已经在回复您问题的评论中提到过。
如果它实际上永远不会改变,你不妨将它存储在静态初始化class:public static final
中。如果我们假设它 永远不会 会发生变化,那么就没有理由通过其他技术(例如从文件或数据库加载)轻松进行更改。
将其存储为具有 150 个条目的 HashMap 还是 class 中的 150 个字段取决于您。我认为这取决于您想如何访问数据。如果您将它存储为 HashMap,那么您可能会访问 String 键上的值,例如Constants.getData("max.search.results")
。如果将其存储为 150 个字段,则只需直接访问这些字段,例如Constants.MAX_SEARCH_RESULTS
.
至于性能,150个条目你不用担心,除非你的数据很大。人们通常将 HashMap 用于数千或数百万条目。
至于何时初始化,Java中的static
字段只在应用程序启动时初始化一次。对于 150 个条目,这应该不到一毫秒(大概估计)。
另见
- Class for constants
- HashMap performance
您似乎可以对其进行硬编码,例如使用地图 String -> String:
public final class CONST
{
public static final Map<String, String> DATA;
static
{
final Map<String, String> data = new HashMap<>(200);
data.put("key001", "value001");
// ...
data.put("key150", "value150");
DATA = Collections.unmodifiableMap(data);
}
}
这会在加载 class 时创建散列 table。如果你出于某种原因想避免这种情况,你也可以使用 initialization-on-demand holder idiom