Java Hashtable - 如何获取任何条目

时间:2011-12-31 00:38:06

标签: java client-server hashtable

我在聊天服务器上工作,并且我将客户端放入Hashtable。 此Hashtable由<String name, Connection c>, Connection具有Socket和进出流量组成。

我可以发送消息,只是在Hashtable中寻找昵称,但我怎样才能将其发送给所有人?

我可以&#34; Scout&#34; (这是一个未知的术语)每个Hashtable的条目? (就像一个数组,我想&#34; SCOUT&#34;每个条目,所以我会做一个循环,我会把这个消息发送给每个人)。

提前致谢。

4 个答案:

答案 0 :(得分:4)

您可以阅读javadocs for HashMap来回答您自己的问题。 “阅读javadocs”是重要的一课每个Java初学者都应该学习并记住

在这种情况下,javadocs将向您展示3种可能有用的方法:

  • keys()方法返回一个由表中的键组成的集合。
  • values()方法返回一个由表中的值组成的集合。
  • entries()方法返回表示表中键/值对的集合。

您可以像其他任何集合一样迭代这些集合。其他答案中有一些例子。


但是,我觉得您的应用程序是多线程的。如果是这种情况,您需要处理两个其他问题,以使您的程序可靠:

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

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

  3. 如果通过在“发送到所有”操作进行时锁定HashMap上的所有其他操作来解决上述两个问题,则会无意中造成性能瓶颈。基本上,其他一切都会停止,直到操作完成。如果你只是在HashMap周围放置一个同步包装器,你会得到类似的效果(但是更精细)。

  4. 您需要阅读并了解这些事情。 (并且在单个SO答案中解释得太多了)。对于可能的所有3个问题的简单(但不是通用)解决方案将在您的用例中使用它使用ConcurrentHashMap而不是普通HashMap

答案 1 :(得分:3)

  

我可以发送消息,只是在Hashtable中查找昵称,但我该如何将其发送给所有人?

然后对哈希表中的所有昵称执行相同的操作:

for (String name : yourTable.keySet())
    yourTable.get(name).send("your message");

或者,或者:

for (Connection conn : yourTable.values())
    conn.send("your message");

答案 2 :(得分:1)

您可以遍历Hashtable中的所有值,并按照您希望的方式执行所有值:

Map<String, Connection> users;
for (Connection connection : users.values()) {
    // Send the message to each Socket here.
}

答案 3 :(得分:0)

Hashtable具有keySet(),它返回该表中的所有键条目。我是从手机发布的,无法得到你的示例链接。如果您想要所有连接列表,可以使用entrySet()。