在 Java 中将 HashMap.toString() 转换回 HashMap

2022-09-01 05:55:57

我在Java中放置了一个键值对,并将其转换为使用该方法。HashMapStringtoString()

是否可以将此表示形式转换回对象并检索具有相应键的值?StringHashMap

谢谢


答案 1

如果 toString() 包含还原对象所需的所有数据,它将起作用。例如,它将适用于字符串映射(其中字符串用作键和值):

// create map
Map<String, String> map = new HashMap<String, String>();
// populate the map

// create string representation
String str = map.toString();

// use properties to restore the map
Properties props = new Properties();
props.load(new StringReader(str.substring(1, str.length() - 1).replace(", ", "\n")));       
Map<String, String> map2 = new HashMap<String, String>();
for (Map.Entry<Object, Object> e : props.entrySet()) {
    map2.put((String)e.getKey(), (String)e.getValue());
}

这有效,尽管我真的不明白为什么你需要这个。


答案 2

toString()方法依赖于 的实现,并且在大多数情况下它可能是有损的。toString()

这里不可能有非有损的解决方案。但更好的方法是使用对象序列化

将对象序列化为字符串

private static String serialize(Serializable o) throws IOException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    ObjectOutputStream oos = new ObjectOutputStream(baos);
    oos.writeObject(o);
    oos.close();
    return Base64.getEncoder().encodeToString(baos.toByteArray());
}

将字符串反序列化回对象

private static Object deserialize(String s) throws IOException,
        ClassNotFoundException {
    byte[] data = Base64.getDecoder().decode(s);
    ObjectInputStream ois = new ObjectInputStream(
            new ByteArrayInputStream(data));
    Object o = ois.readObject();
    ois.close();
    return o;
}

在这里,如果用户对象具有暂时的字段,它们将在此过程中丢失。


旧答案


一旦你使用toString()将HashMap转换为字符串;这并不是说你可以从那个字符串将其转换回哈希映射,它只是它的字符串表示形式。

可以将对 HashMap 的引用传递给方法,也可以将其序列化

下面是 toString() toString()
的描述 下面是带有序列化说明的示例代码。

并将 hashMap 作为 arg 传递给方法。

public void sayHello(Map m){

}
//calling block  
Map  hm = new HashMap();
sayHello(hm);