hashmap的get方法得到的值为空

2019-03-25 13:39|来源: 网路

我用hashmap存放通信线程
//其中hm的key为用户名,value为对应的通信线程,hashmap定义在ManagerClientSocket中
public class ManagerClientSocket {
    //用hashmap来存放各个客户端与服务器的连接socket,并用客户名标识这些socket
    public static  HashMap<String,SerConClientThread> hm=new HashMap<String,SerConClientThread>();
    //存存放线程
    public static void addClientSocket(String uid,SerConClientThread sc){
        hm.put(uid, sc);
    }
         //取得线程
    public static SerConClientThread getClientSocket(String uid){
        return (SerConClientThread)hm.get(uid);
    }
        
}


然后我在服务器类Server中存进线程,代码如下:
//SerConClientThread是一个线程类,用于实现客户端与服务器的连接
SerConClientThread scct=new SerConClientThread(s);
ManagerClientSocket.addClientSocket(u.getUsername(), scct);


在SerConClientThread类中去hm中取值,却总是取得null,代码如下:
SerConClientThread sc=ManagerClientSocket.getClientSocket(u.getUsername()); //取线程
//sc总是为null

请教网友,这是哪里出了问题?

问题补充:
guoqiang.xie 写道
先查查存取的顺序吧! 如果代码中先取的话, 肯定取不到。

hashmap是根据key的hashcode来存取的,现在用根据key来get不行吗?

问题补充:
skzr.org 写道
缺少信息,如果不存在自定义类装载器的话,不应当发生你说的问题。
除非此u.getUsername()非原来put的值。

建议put前写入日志看看username对应的Thread是什么。
建议get前写入日志看看传入的username是什么。

测试了一下,此u.getUsername()非原来put的值,重写hashCode

问题补充:
skzr.org 写道
ROACH11 写道
测试了一下,此u.getUsername()非原来put的值,重写hashCode

//取得线程  
    public static SerConClientThread getClientSocket(String uid){  
        return (SerConClientThread)hm.get(uid);  
    }  

你提问的代码看,这里是没有问题的。
呵呵,估计是那个u.getUsername(),u的获取有问题。

skzr.org 写道
ROACH11 写道
测试了一下,此u.getUsername()非原来put的值,重写hashCode

//取得线程  
    public static SerConClientThread getClientSocket(String uid){  
        return (SerConClientThread)hm.get(uid);  
    }  

你提问的代码看,这里是没有问题的。
呵呵,估计是那个u.getUsername(),u的获取有问题。

我这个u是另一个对象,因为我取线程实在SerConClientThread类里面,所以重新new的一个user

相关问答

更多