日期:2014-05-20  浏览次数:20822 次

一个关于vector的小问题
我们的作业是写一个聊天程序,因为涉及多线程,所以我选择Vector来保存Tcp服务器端和客户端建立的连接对象Connections
因为Vector是线程同步的,我看了网上一些代码,对这个Vector存储自定义对象有些疑问,请大师解答^_^

Java code

//比如Vector存储的是Connections类别
static Vector<Connection> connVector=new Vector<Connection>(10)//存储建立连接的Connection
...
...//关于Connection类的实现就省略了,为了简单变量的定义也省略,只说主要问题
   socket = server.accept();//make a connection with client
   System.out.println(socket.getInetAddress().toString()+"joined the server\n");
   Connection connect=new Connection(socket);
   connVector.add(connect);//把建立的链接存入connVector



OK,现在我的问题是,在client的一个实例加入Vector的时候,并没有什么唯一的关键字,在遍历Vector去移除一个对象的时候,它怎么知道要移除谁呢?比如
Java code

    while(connVector.size()>0){
        Connection connect=(Connection)connVector.firstElement();//取出Vector中第一个服务器客户机的Tcp链接
        try{
            connect.socket.close();//socket 是Connection中定义的方法
        }catch(IOException ex){
            ex.printStackTrace();
        }
        connVector.removeElement(connect);//ok我的问题主要在这一步
    }



在connect被存入这个Vector的时候,所有的connect貌似都没有名字,而且我在自己机器上测试的,所以connect在我个人认为都长的一样的,这个Vector在remove的时候,如何辨认就是remove的这个connect呢?
Vector是可以有重复对象的,有没有这种可能,我这个机器上又运行Tcp服务器端又运行三个客户端,结果三个客户端Ip,socket什么的都一样,也就是Vector内容都一样,一个removeElement(connect)就把三个客户端都关闭了?

------解决方案--------------------
removeElement(Object)使用的equals方法比较的两个对象,会遍历移除第一个匹配equals的
Java code
 public synchronized int indexOf(Object o, int index) {
    if (o == null) {
        for (int i = index ; i < elementCount ; i++)
        if (elementData[i]==null)
            return i;
    } else {
        for (int i = index ; i < elementCount ; i++)
        if (o.equals(elementData[i]))
            return i;
    }
    return -1;
    }