Java 发送更改的hashmap,但使用ObjectOutputStream和ObjectInputStream获取相同的hashmap

Java 发送更改的hashmap,但使用ObjectOutputStream和ObjectInputStream获取相同的hashmap,java,hashmap,objectoutputstream,objectinputstream,Java,Hashmap,Objectoutputstream,Objectinputstream,这是怎么发生的?ObjectOutputStream会记住它已经写入的对象,并且在重复写入时只会输出一个指针(而不会再次输出内容)。这保留了对象标识,对于循环图是必要的 因此,您的流包含的内容基本上是: 内容为{1:1}的哈希映射 指针:“HashMap A再次出现” 您需要在您的案例中使用一个新的HashMap实例。如前所述,ObjectOutputStream保留它已经编写的内容的缓存。您可以按照他的建议使用新地图,也可以清除缓存 调用writeObject之间的调用将清除缓存并提供您最

这是怎么发生的?

ObjectOutputStream会记住它已经写入的对象,并且在重复写入时只会输出一个指针(而不会再次输出内容)。这保留了对象标识,对于循环图是必要的

因此,您的流包含的内容基本上是:

  • 内容为{1:1}的哈希映射
  • 指针:“HashMap A再次出现”
您需要在您的案例中使用一个新的HashMap实例。

如前所述,
ObjectOutputStream
保留它已经编写的内容的缓存。您可以按照他的建议使用新地图,也可以清除缓存

调用
writeObject
之间的调用将清除缓存并提供您最初期望的行为

{1=1}
{1=1}
publicstaticvoidmain(字符串[]args)抛出IOException,
ClassNotFoundException{
ByteArrayOutputStream bas=新的ByteArrayOutputStream();
try(ObjectOutputStream oos=newobjectoutputstream(baos)){
HashMap foo=新的HashMap();
foo.put(1,1);
oos.writeObject(foo);
//oos.reset();
foo.put(2,2);
oos.writeObject(foo);
}
ByteArrayInputStream bais=新的ByteArrayInputStream(baos.toByteArray());
try(ObjectInputStream ois=新ObjectInputStream(BAI)){
System.out.println(ois.readObject());
System.out.println(ois.readObject());
}
}

您还可以重置ObjectOutputStream(而不必创建新的hashmap对象)。谢谢,我想知道这是否发生在其他数据结构上?当然,所有对象都会发生。
{1=1}
{1=1}
public static void main(String[] args) throws IOException,
        ClassNotFoundException {
    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
        HashMap<Integer, Integer> foo = new HashMap<>();
        foo.put(1, 1);
        oos.writeObject(foo);
        // oos.reset();
        foo.put(2, 2);
        oos.writeObject(foo);
    }

    ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
    try (ObjectInputStream ois = new ObjectInputStream(bais)) {
        System.out.println(ois.readObject());
        System.out.println(ois.readObject());
    }
}