相关文章
更多最近更新
更多hashmap的get方法得到的值为空
2019-03-25 13:39|来源: 网路
我用hashmap存放通信线程
然后我在服务器类Server中存进线程,代码如下:
在SerConClientThread类中去hm中取值,却总是取得null,代码如下:
请教网友,这是哪里出了问题?
问题补充:
hashmap是根据key的hashcode来存取的,现在用根据key来get不行吗?
问题补充:
测试了一下,此u.getUsername()非原来put的值,重写hashCode
问题补充:
你提问的代码看,这里是没有问题的。
呵呵,估计是那个u.getUsername(),u的获取有问题。
你提问的代码看,这里是没有问题的。
呵呵,估计是那个u.getUsername(),u的获取有问题。
我这个u是另一个对象,因为我取线程实在SerConClientThread类里面,所以重新new的一个user
//其中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的值。
建议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
相关问答
更多-
HashMap.values()返回一个Collection 。 您可以遍历集合而无需将其转换为数组(或列表)。 for (ArrayList
-
这真的取决于你需要什么类型的安全。 非通用的做法最好的做法是: Map x = new HashMap(); 请注意, x键入为Map 。 这使得将来更容易更改实现(到TreeMap或LinkedHashMap )。 您可以使用泛型来确保一定程度的类型安全: Map
x = new HashMap (); 在Java 7及更高版本中,您可以做到 Map x = new HashMap<>(); 以上虽然更详 ... -
在Java中为HashMap添加空值或值的用法是什么?(What is the use of adding a null key or value to a HashMap in Java?)[2021-10-12]
我不是积极的问题,但如果你正在寻找一个人想要使用空键的例子,我们经常在地图中使用它们来表示默认情况(即应该使用的值如果给定的键不存在): Map foo; A search; B val = foo.containsKey(search) ? foo.get(search) : foo.get(null); HashMap特别处理空键(因为它不能在空对象上调用.hashCode() ),但空值不是任何特殊的,它们像其他任何东西一样存储在地图中 I'm not positive what you ... -
HashMap是一个Map实现,其关键特性是恒定时间O(1)查找。 具有恒定时间查找的计算机科学中唯一的数据结构是固定长度的数组。 初始化HashMap时,它会创建一个固定长度的数组,当您的条目超出当前数组的大小时,它将展开。 编辑:@kutschkem指出,当条目数大约是当前数组大小的80%时,java.util.HashMap会扩展其固定长度数组,而不是当条目超过当前数组的大小时。 HashMap is a Map implementation that's crucial feature is con ...
-
根据Golang中hashmap的值获取密钥的简单方法(Simple way of getting key depending on value from hashmap in Golang)[2021-10-31]
这没有内置功能; 你必须自己做。 下面是一个适用于map[string]int的示例函数,您可以为其他地图类型进行调整: func mapkey(m map[string]int, value int) (key string, ok bool) { for k, v := range m { if v == value { key = k ok = true return } } return } 用法: key, ok := mapke ... -
使用computeIfAbsent : private void add(String currentVersion, String targetVersion, Object object) { definedUpdatePlans.computeIfAbsent(currentVersion, k -> new HashMap()) .put(targetVersion, object); } 它返回: 与指定键关联的当前(现有或已计算)值,如果计算 ...
-
HashMap的get()方法(get() method for HashMap)[2024-01-31]
您可以在使用特殊的Keys对象作为哈希映射的关键时使用 - 然后您需要正确地实现hashCode,并且正如其他人所解释的那样在Keys类上等于。 但是,除非你有特殊的理由不这样做,否则你真的可以使用String作为哈希映射的关键。 创建一些方法,如下所示: private static String getHashMapKeyFor(int intKey, String stringKey) { return stringKey + "|" + intKey; } 并将哈希映射声明为将String作为 ... -
Kotlin将带有空值的列表转换为不带空格的HashMap(Kotlin convert List with nullables to HashMap without nullables)[2022-09-27]
你可以做: list.mapNotNull { e -> e.id?.let { it to e } }.toMap() 分解: 与?.的呼叫?. 如果元素为null,则安全调用操作符将使结果为空。 所以传递给mapNotNull的lambda类型是(Somedata) -> Pair。 mapNotNull放弃空对, toMap将产生的List >转换为Map 。 如果你想避免创建一个中 ... -
检测带有Java Optional的Hashmap是否具有空值?(Detect if a Hashmap with Java Optional has empty values or not?)[2023-09-07]
使用java 8 stream的API。 使用allMatch boolean allEmpty = aMap.values() .stream() .allMatch(opt -> !opt.isPresent()); 或者使用noneMatch boolean allEmpty = aMap.values() .stream() .noneMatch(Optional::isPresent); 从文档中引入要注意的是两种方法都是“短路终端操作” 这是一种短路终端操作。 ... -
有设置callSettersOnNulls ,请看这里 。 默认值为false,因此不会在null值上调用setter,但可以将其设置为true。 There is the setting callSettersOnNulls, see here. The default is false, so no setter will be called on a null value, but you can set it to true.