Похоже, что Hashtable
вставит копию экземпляра в свою структуру поддержки. Andypandy прав насчет вашей проблемы, но потом мне стало интересно, исправит ли таблица OuputStream
s (где вы не обернули бы поток вывода сокета), но это не так.
import java.io.ByteArrayOutputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;
import java.util.Hashtable;
public class Main
{
public static void main(String[] args) throws IOException {
Hashtable<Integer, OutputStream> ht = new Hashtable<Integer, OutputStream>();
for(int i = 0; i < 5; i++)
ht.put( i, new DataOutputStream(new ByteArrayOutputStream()) );
Socket sock = new Socket("google.com", 80);
ht.put( ht.size(), sock.getOutputStream() );
for(OutputStream dos : ht.values())
System.out.println(dos);
System.out.println(sock.getOutputStream());
}
}
Выход:
java.net.SocketOutputStream@112b853
java.io.DataOutputStream@36428
java.io.DataOutputStream@a4b78b
java.io.DataOutputStream@e3f6d
java.io.DataOutputStream@1660d22
java.io.DataOutputStream@e84763
java.net.SocketOutputStream@1a6c368
Выходной поток сокета, который вставляется в таблицу, имеет адрес, отличный от исходного потока вывода. Поскольку нет переопределения equals
, нет простого способа осмысленного сравнения потоков без знания их соответствующих сокетов. Вам следует полностью переосмыслить свой дизайн, возможно, используя дескриптор сокета в качестве ключа.