gpt4 book ai didi

Java:HashMap.get 返回 null

转载 作者:行者123 更新时间:2023-11-29 10:17:09 25 4
gpt4 key购买 nike

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

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

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

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] User has logged in with session token 92:B7:F8:C6:4B:53:17:3A.

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

// 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)));

日志:

[01:51:09] Token: 92:B7:F8:C6:4B:53:17:3A

[01:51:09] Key Core.clients #01 = 92:B7:F8:C6:4B:53:17:3A

[01:51:09] false

[01:51:09] Client: null

那么,我怎样才能找出问题所在呢?

最佳答案

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

关于Java:HashMap.get 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14553115/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com