Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java';s哈希表-如何获取任何条目_Java_Client Server_Hashtable - Fatal编程技术网

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()
    方法返回表示表中键/值对的集合
您可以像任何其他集合一样迭代这些集合。其他答案中有一些例子


然而,我得到的印象是,您的应用程序是多线程的。如果是这种情况,则需要处理另外两个问题,以使程序可靠:

  • 如果两个或多个线程可以使用相同的对象或数据结构,则它们需要采取必要的步骤以确保它们正确同步。如果没有,则存在一种非零概率,即某些操作序列将导致数据结构进入不一致状态,或者一个或多个线程将看到不一致状态(由于内存缓存、保存在寄存器中的值等)

  • 如果一个线程正在使用HashMap的一个集合迭代器,而另一个线程添加或删除一个条目,那么第一个线程可能会得到一个
    ConcurrentModificationException

  • 如果在执行“全部发送”操作时通过锁定
    HashMap
    上的所有其他操作来解决上述两个问题,则会无意中造成性能瓶颈。基本上,所有其他操作都会停止,直到操作完成。如果您只需在
    HashMap
    周围放置一个同步包装器,就可以获得类似的效果(但规模更大)


  • 你需要阅读和学习这些东西。(在一个简单的答案中,要解释的太多了)。一个简单的(但不是通用的)解决方案,可以解决所有3个可能在您的用例中起作用的问题—使用
    ConcurrentHashMap
    而不是普通的
    HashMap

    我相信第二个选项是OP要求的。第一种选择有点缺陷。实际上,您应该获取entrySet()并对其进行迭代,因为它比每次迭代键然后调用get更有效。FindBugs和Lint都将此标记为编码问题。如果您不需要使用
    名称
    ,则方法2更有效。尽管如此,不管第三方网站怎么说,我都不会说这个方法有缺陷或有漏洞。我之所以这样做是因为OPs明确的表述,他知道如何将信息发送给一个特定的昵称。(我只是给了他一种方法,让他可以重复所有的昵称。)谁知道,实际的消息格式可能取决于目的地的昵称。@StephenC-嗯,这也是家庭作业。我不确定这是不是一个适当的时机将这些主题放在OP上。他仍然在学习基础知识。@Perception-如果你调用
    entrySet
    并反复访问,你会得到同样包含名称的条目-因为效率和其他方面的相同功能,所以效果更好(但我也不会说它有缺陷,有点缺陷?嗯,只是因为findbugs&lint捡起了它)该死,这是我第一年用java和第二个英语,我有点迷路。无论如何,谢谢你的提示。我会考虑我明天能做什么,现在在我的国家已经很晚了。P:谢谢你的API提示。无论如何,是我的第一个项目,所以它不应该是复杂的。