我该如何使用Hashmap存储对象?

时间:2013-04-01 22:06:36

标签: java hashmap bukkit

我正在开发一个插件,它将clans(Clan类对象)存储在一个hashmap中,以便在操作期间使用。 hasmap将存储在一个文件中(整个序列化hashmap是理想的,但我不确定这是否可行)以后再重新加载。

我应该如何保存对象?我可以序列化整个hashmap吗?提前致谢;我是hashmaps的新手:P

4 个答案:

答案 0 :(得分:2)

HashMap本身实现了Serializable,因此如果键和值都可序列化,您可以序列化整个HashMap。首先,您必须决定使用哪个密钥。键可以是任何对象,但必须实现equals(..)和hashCode()方法,以便可以在HashMap中标识键。

在您的情况下,您可以使用Clan名称作为表示为String对象的键。此外,Clan应该实现Serializable(或Externalizable)。

public class Clan 
    implements Serializable 
{
    ...
}

按如下方式创建HashMap(使用Java 1.5或更高版本):

Map<String, Clan> clans = new HashMap<String, Clan>();

将其序列化为如下文件:

FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeObject(clans);

oos.close();

使用ObjectInputStream对其进行反序列化。 Java序列化过程非常缓慢,因此如果速度是一个问题,您应该检查替代序列化技术。 Kryo是一个非常简单快速的序列化库(https://code.google.com/p/kryo/)。

答案 1 :(得分:1)

是的,您可以序列化HashMap个对象,因为该类已经实现了Serializable接口。来自HashMap文档:

  

公共类HashMap扩展AbstractMap实现Map,Cloneable,Serializable

请注意,您的Clan类必须实现Serializable接口才能进行序列化。如果您要在地图中使用Clan类作为键,则必须覆盖hashCodeequals方法。

答案 2 :(得分:1)

当然可以,因为HashMap是可序列化的。不要忘记make Clan也可序列化

写入文件:

FileOutputStream fos = new FileOutputStream("clans");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(clans);
oos.close();

从文件中读取:

FileInputStream fis = new FileInputStream("clans");
ObjectInputStream ois = new ObjectInputStream(fis);
HashMap<String, Clan> clans = (HashMap) ois.readObject();
ois.close();

答案 3 :(得分:1)

只要地图中的所有项目都实现Serializable,您就可以轻松使用Java的内置序列化,这是一个简单的示例:

public static void main(String[] args) throws IOException, ClassNotFoundException {
    final Map<Serializable, Serializable> myMap = new HashMap<>();
    final File myFile = new File("/path/to/file");
    try (final ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(myFile))) {
        oos.writeObject(myMap);
    }
    final Map<Serializable, Serializable> myReadMap;
    try (final ObjectInputStream ois = new ObjectInputStream(new FileInputStream(myFile))) {
        myReadMap = (Map<Serializable, Serializable>) ois.readObject();
    }
}

Map myMap包含Serializable个键和值,会保存到文件中,然后从文件中读取myReadMap