Java';s哈希表-如何获取任何条目
我在一个聊天服务器上工作,我把客户机放到一个哈希表中。 此哈希表由Java';s哈希表-如何获取任何条目,java,client-server,hashtable,Java,Client Server,Hashtable,我在一个聊天服务器上工作,我把客户机放到一个哈希表中。 此哈希表由,组成,其中连接具有套接字和输入输出流 我可以发送消息只是在哈希表中寻找一个缺口,但我如何才能将其发送给所有人 我可以“侦察”(这是未知术语)每个哈希表的条目吗?(就像一个数组,我想“侦察”每个条目,所以我会做一个循环,然后将消息发送给每个人) 提前感谢。Hashtable有keySet(),它返回该表中的所有键项。我是从手机上发的,找不到你的示例链接。如果需要所有连接列表,可以使用entrySet()。可以迭代哈希表中的所有值,
,
组成,其中连接
具有套接字
和输入输出流
我可以发送消息只是在哈希表中寻找一个缺口,但我如何才能将其发送给所有人
我可以“侦察”(这是未知术语)每个哈希表的条目吗?(就像一个数组,我想“侦察”每个条目,所以我会做一个循环,然后将消息发送给每个人)
提前感谢。Hashtable有keySet(),它返回该表中的所有键项。我是从手机上发的,找不到你的示例链接。如果需要所有连接列表,可以使用entrySet()。可以迭代哈希表中的所有值,并对所有值执行所需操作:
Map<String, Connection> users;
for (Connection connection : users.values()) {
// Send the message to each Socket here.
}
地图用户;
for(连接:users.values()){
//将消息发送到此处的每个套接字。
}
我可以发送消息,只是在哈希表中查找一个缺口,但如何才能将其发送给所有人?
然后对哈希表中的所有昵称执行相同的操作:
for (String name : yourTable.keySet())
yourTable.get(name).send("your message");
或者,或者:
for (Connection conn : yourTable.values())
conn.send("your message");
你可以通过阅读文章来回答自己的问题。“阅读javadocs”是一门重要的课程,每个Java初学者都应该学习和记住 在本例中,javadocs将向您展示3种可能有用的方法:
方法返回由表中的键组成的集合keys()
方法返回由表中的值组成的集合values()
方法返回表示表中键/值对的集合entries()
然而,我得到的印象是,您的应用程序是多线程的。如果是这种情况,则需要处理另外两个问题,以使程序可靠:
ConcurrentModificationException
HashMap
上的所有其他操作来解决上述两个问题,则会无意中造成性能瓶颈。基本上,所有其他操作都会停止,直到操作完成。如果您只需在HashMap
周围放置一个同步包装器,就可以获得类似的效果(但规模更大)你需要阅读和学习这些东西。(在一个简单的答案中,要解释的太多了)。一个简单的(但不是通用的)解决方案,可以解决所有3个可能在您的用例中起作用的问题—使用
ConcurrentHashMap
而不是普通的HashMap
我相信第二个选项是OP要求的。第一种选择有点缺陷。实际上,您应该获取entrySet()并对其进行迭代,因为它比每次迭代键然后调用get更有效。FindBugs和Lint都将此标记为编码问题。如果您不需要使用名称
,则方法2更有效。尽管如此,不管第三方网站怎么说,我都不会说这个方法有缺陷或有漏洞。我之所以这样做是因为OPs明确的表述,他知道如何将信息发送给一个特定的昵称。(我只是给了他一种方法,让他可以重复所有的昵称。)谁知道,实际的消息格式可能取决于目的地的昵称。@StephenC-嗯,这也是家庭作业。我不确定这是不是一个适当的时机将这些主题放在OP上。他仍然在学习基础知识。@Perception-如果你调用entrySet
并反复访问,你会得到同样包含名称的条目-因为效率和其他方面的相同功能,所以效果更好(但我也不会说它有缺陷,有点缺陷?嗯,只是因为findbugs&lint捡起了它)该死,这是我第一年用java和第二个英语,我有点迷路。无论如何,谢谢你的提示。我会考虑我明天能做什么,现在在我的国家已经很晚了。P:谢谢你的API提示。无论如何,是我的第一个项目,所以它不应该是复杂的。