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

Jus*_*tFF 3 java hashmap objectoutputstream objectinputstream

public static void main(String[] args) throws Exception {
    Socket socket = new Socket("127.0.0.1", 2345);

    ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
    Map<Integer, Integer> testMap = new HashMap<Integer, Integer>();

    testMap.put(1,1);
    oos.writeObject(testMap);
    oos.flush();

    testMap.put(2,2);
    oos.writeObject(testMap);
    oos.flush();

    oos.close();
}


public static void main(String[] args) throws Exception {
    ServerSocket ss = new ServerSocket(2345);
    Socket s = ss.accept();
    ObjectInputStream ois = new ObjectInputStream(s.getInputStream());

    System.out.println((HashMap<Integer, Integer>) ois.readObject());
    System.out.println((HashMap<Integer, Integer>) ois.readObject());

    ois.close;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码来自两个文件.运行它们时,控制台会打印相同的结果:

{1=1}
{1=1}
Run Code Online (Sandbox Code Playgroud)

怎么会发生这种情况?

Thi*_*ilo 6

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

那么你的流包含的基本上是:

  • 内容为{1:1}的HashMap A
  • 指针:"HashMap A再次"

您需要在您的案例中使用新的HashMap实例.