首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >HashMap.get返回null

HashMap.get返回null
EN

Stack Overflow用户
提问于 2013-01-27 22:34:12
回答 1查看 1.5K关注 0票数 1

我正在用Java为AS3中的MMORPG编写一个套接字服务器。我对HashMap.get(byte[])的奇怪行为有一些问题。什么事情会导致以下问题?

我不使用任何序列化系统,我发送字节,客户机和服务器都知道如何处理接收到的字节。客户端提出的第一个请求是要求服务器创建一个播放会话。服务器将生成一个带有8个条目的随机会话令牌作为byte[],并将令牌添加到HashMap中。响应将是9字节长。第一个定义响应类型(在本例中是字节'+‘,意思是“您已被接受。这是您的令牌”)。字节2-9是标记.客户端必须存储令牌并将其附加到任何进一步的请求中(这个概念可以与PHP会话进行比较)。

这是将客户端添加到HashMap的代码:

代码语言:javascript
运行
复制
byte[] token = Util.generateToken();

// f is ResultSet entry of JDCB SQL query return value
Client client = new Client(f.getInt("id"), token);
Core.clients.put(token, client);

// I display client.token instead of token to make sure client != null      
Log.log("User " + f.getString("name") + " has logged in with session token " + Util.getHexString(client.token) + ".");

日志:

01:50:30用户已使用会话令牌92:B7:F8:C6:4B:53:17:3A登录。

这些调试行将在任何进一步的请求中显示:

代码语言:javascript
运行
复制
// Show (byte[]) Token as Hex String, 8 bytes long
Log.soc("Token: " + Util.getHexString(buffer.getBytes(1, 9)));

// Show all keys in (HashMap<byte[], client>) Core.clients
int it = 0;
for (byte[] b : Core.clients.keySet())
Log.soc("Key Core.clients #" + StringUtils.leftPad(String.valueOf(++it), 2, '0') + " = " + Util.getHexString((b)));

// Display availability bool to make sure
Log.soc(Core.clients.containsKey(buffer.getBytes(1, 9)));

// Get Core.clients value where key = Token
Log.soc("Client: " + Core.clients.get(buffer.getBytes(1, 9)));

日志:

象征性: 92:B7:F8:C6:4B:53:17:3A 01:51:09键Core.clients #01 = 92:B7:F8:C6:4B:53:17:3A 01:51:09假 01:51:09客户机: null

那么,我怎么知道出了什么问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-01-27 22:38:46

HashMap使用hashCode()equals()从给定的键中查找条目。而一个字节数组将永远只等于它自己。它将不等于另一个字节数组,即使其他字节数组具有相同的长度和相同的字节。您应该将数组封装在一个覆盖equals()hashCode()的键类中,以使其工作。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14553115

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档