Java 的哈希表 - 如何获取任意条目

标签 java client-server hashtable

我正在开发一个聊天服务器,并将客户端放入哈希表中。 该哈希表由 <String name, Connection c>, 组成哪里ConnectionSocket和进出流量。

我可以发送消息,只是在哈希表中查找缺口,但如何将其发送给所有人?

我可以“侦察”(这是一个未知术语)每个哈希表的条目吗? (就像一个数组,我想“侦察”每个条目,所以我将执行一个循环并将消息发送给每个人)。

提前致谢。

最佳答案

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

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

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

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

<小时/>

但是,我的印象是您的应用程序是多线程的。如果是这种情况,那么您还需要处理其他两个问题才能使您的程序可靠:

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

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

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

您需要阅读并了解这些内容。 (在一个 SO 答案中需要解释的东西太多了)。一个简单(但不是通用)的解决方案可以解决所有 3 个问题,可能将在您的用例中使用 ConcurrentHashMap 而不是普通的 HashMap.

关于Java 的哈希表 - 如何获取任意条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8685431/

相关文章:

java - 如何用Java编程检测进程和端口是否存活?

Java 服务器-客户端 readLine() 方法

javascript - 使用 javascript 找出不同之处

c++ - 带字符串检查的哈希表

c++ - 哈希表——哈希函数实现

java - ClassCastException : Fragment cannot be cast to Fragment

java以编程方式改变形状的属性

java - java GUI 中这些被阻止的部分是什么

java - 由对等方重置连接

c - 当客户端套接字在C中终止时如何防止服务器套接字关闭?