【问题标题】:Storing Object States in java在java中存储对象状态
【发布时间】:2015-07-24 07:56:45
【问题描述】:

我需要在一个时间周期结束时将数千个对象状态存储在一个文件中,并在每个新周期开始时将它们恢复到主内存中。

所以到目前为止我想到了两种方法:

例如将这些对象直接存储为

class UsingClassObjects {
    private String name;
    private int age;
    private long rollNo;
    private long credits;

}

或者创建一个hashMap来存储状态:

class UsingHashMap{
    HashMap<Integer, HashMap<String, HashMap<Long, Long>>> data = new HashMap<Integer, HashMap<String, HashMap<Long, Long>>>();

}

那么这两种方法中哪一种在内存和效率方面更好,为什么?

还有更好的方法吗?

如果我使用 HashMap,序列化对象会影响性能而不是将状态写入纯文本文件吗?

【问题讨论】:

  • 不能使用数据库吗?
  • 根据您的用例,您可能会找到适合您要求的非关系型数据库,如 MongoDB (mongodb.org) 或 ObjectDB (objectdb.com) 等基于对象的解决方案。它们针对快速数据检索进行了优化。
  • “UsingHashMap”选项会浪费大量内存,因为您有数十个、数百个甚至数千个 HashMap 实例。您需要的数据结构取决于您如何访问它,而不是您计划如何存储它。
  • @npinti 不,不能使用数据库
  • @Robert 但是只有一个 Main hashMap 对象包含许多键及其对应的值(作为嵌套的 hashMaps)。

标签: java performance serialization hashmap


【解决方案1】:

序列化对象并存储在文件中比您的 HashMap 方法要好得多,因为它可能会浪费。如果 POJO 不复杂,那么序列化/反序列化也将是微不足道的。您也可以使用数据库,这会很有帮助。你也可以使用像 REDIS 这样的缓存。

【讨论】:

    【解决方案2】:

    将状态存储在 HashMap 中并不是一个好的选择,因为: 1.最终它是一个对象,如果你的服务器崩溃或者你停止JVM,它就会死。

    1. 如果您在 HashMap 中存储 1000 个对象,这将增加内存,并且有可能出现内存不足的问题。

    2. HashMap 会为其中的每个条目对象消耗大量内存。

    因此,我建议使用 Java 序列化来存储对象的状态,即使 JVM 关闭也会保留该状态。

    【讨论】:

    • 如果我使用序列化来存储一个 hashMap 而不是单独存储数千个对象呢?
    • 如果你想更新 1 个文件的序列化版本,即实体的新版本,在这种情况下你必须反序列化完整的地图,这是不必要的过度!您认为 HashMap 的关键是什么?
    猜你喜欢
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2015-01-22
    • 2021-11-21
    • 1970-01-01
    • 2020-06-21
    • 2020-10-22
    相关资源
    最近更新 更多