的序列化形式不会序列化存储桶本身,并且哈希代码不是持久状态的一部分。来自 javadocs:java.util.HashMap
串行数据:HashMap 的容量(存储桶数组的长度)发出 (int),后跟 HashMap 的大小(键值映射的数量),然后是 HashMap 表示的每个键值映射的键 (对象) 和值 (对象)。entrySet().iterator()
与 http://java.sun.com/j2se/1.5.0/docs/api/serialized-form.html#java.util.HashMap 相比
持久状态基本上包括键和值以及一些内务管理。当反序列化时,哈希映射被完全重建;重新哈希键并将其放置在适当的存储桶中。
因此,添加字符串键应该可以正常工作。我猜你的错误在别处。
编辑:这是一个 junit 4 测试用例,它序列化和反序列化映射,并最小化更改哈希码的 VM。测试通过,尽管哈希码在反序列化后有所不同。
import org.junit.Assert;
import org.junit.Test;
import java.io.*;
import java.util.HashMap;
public class HashMapTest
{
@Test
public void testHashMapSerialization() throws IOException, ClassNotFoundException
{
HashMap map = new HashMap();
map.put(new Key("abc"), 1);
map.put(new Key("def"), 2);
ByteArrayOutputStream out = new ByteArrayOutputStream();
ObjectOutputStream objOut = new ObjectOutputStream(out);
objOut.writeObject(map);
objOut.close();
Key.xor = 0x7555AAAA; // make the hashcodes different
ObjectInputStream objIn = new ObjectInputStream(new ByteArrayInputStream(out.toByteArray()));
HashMap actual = (HashMap) objIn.readObject();
// now try to get a value
Assert.assertEquals(2, actual.get(new Key("def")));
}
static class Key implements Serializable
{
private String keyString;
static int xor = 0;
Key(String keyString)
{
this.keyString = keyString;
}
@Override
public int hashCode()
{
return keyString.hashCode()^xor;
}
@Override
public boolean equals(Object obj)
{
Key otherKey = (Key) obj;
return keyString.equals(otherKey.keyString);
}
}
}