我正在开发一个聊天服务器,并将客户端放入哈希表中。
该哈希表由 <String name, Connection c>,
组成哪里Connection
有Socket
和进出流量。
我可以发送消息,只是在哈希表中查找缺口,但如何将其发送给所有人?
我可以“侦察”(这是一个未知术语)每个哈希表的条目吗? (就像一个数组,我想“侦察”每个条目,所以我将执行一个循环并将消息发送给每个人)。
提前致谢。
最佳答案
您可以通过阅读 javadocs for HashMap
来回答您自己的问题。 “阅读 javadocs”是重要的一课,每个 Java 初学者都应该学习并记住。
在这种情况下,javadocs 将向您展示 3 种可能有用的方法:
keys()
方法返回一个由表中的键组成的集合。values()
方法返回一个由表中的值组成的集合。entries()
方法返回一个表示表中键/值对的集合。
您可以像迭代任何其他集合一样迭代这些集合。其他答案里有例子。
<小时/>但是,我的印象是您的应用程序是多线程的。如果是这种情况,那么您还需要处理其他两个问题才能使您的程序可靠:
如果两个或多个线程可以使用相同的对象或数据结构,则它们需要采取必要的步骤来确保它们正确同步。如果不这样做,则某些操作序列将导致数据结构进入不一致状态的非零概率,或者一个或多个线程将看到 不一致的状态(由于内存缓存、寄存器中保存的值等)。
如果一个线程正在使用 HashMap 的集合迭代器之一,而另一个线程添加或删除条目,则第一个线程可能会收到
ConcurrentModificationException
。如果您通过在“发送给所有人”操作进行时锁定
HashMap
上的所有其他操作来解决上述两个问题,则会无意中造成性能瓶颈。基本上,其他一切都会停止,直到操作完成。如果您简单地在HashMap
周围放置一个同步包装器,您会得到类似的效果(但规模更小)。
您需要阅读并了解这些内容。 (在一个 SO 答案中需要解释的东西太多了)。一个简单(但不是通用)的解决方案可以解决所有 3 个问题,可能将在您的用例中使用 ConcurrentHashMap
而不是普通的 HashMap
.
关于Java 的哈希表 - 如何获取任意条目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8685431/