ThreadLocal可以作为HashMap中的Key吗?
Can ThreadLocal be used as Key in HashMap?
ThreadLocal可以作为HashMap中的Key吗?
如果是这样,它是如何工作的,它通常是个坏主意吗?我应该注意什么?
正如 Jaroslaw Pawlak 评论的那样,由于 ThreadLocal
没有实现 hashCode()
和 equals()
它不适合 key HashMap
,至少如果你希望它表现良好。
就算做了也没用。考虑到 ThreadLocal
的用例,使用包含的对象作为键会更清楚。
具有一个 ThreadLocal
(具有线程特定内容)映射的映射最终会得到 ThreadLocal
(将线程映射到值的映射)的内部映射用于实际映射。
更不用说 ThreadLocal
个实例在某种程度上是不推荐的。他们有的常见用例通过引入"native"threadlocal类来解决,比如java.util.concurrent.ThreadSafeRandom
.
您可以像使用任何其他对象一样将 ThreadLocal
用作 HashMap 键。有没有意义就是另外一个话题了
基本上,如果您使用可变对象作为 HashMap
、HashSet
等对象的键,您可能会遇到问题,因为那些 类 通常使用 hashCode()
(因此得名)将东西放入桶中并取回它。因此,如果您使用可变对象作为键,然后更改对象(以 hashCode 更改的方式),然后尝试通过键检索条目,您将不再找到该条目,因为映射将在错误的存储桶中查找条目。
在 ThreadLocal
的情况下,这不是问题,因为它不会覆盖 equals()
和 hashCode()
,因此 hashCode()
不会改变,如果你更改对象,这样您就可以可以安全地使用ThreadLocal
作为键。
ThreadLocal可以作为HashMap中的Key吗?
如果是这样,它是如何工作的,它通常是个坏主意吗?我应该注意什么?
正如 Jaroslaw Pawlak 评论的那样,由于 ThreadLocal
没有实现 hashCode()
和 equals()
它不适合 key HashMap
,至少如果你希望它表现良好。
就算做了也没用。考虑到 ThreadLocal
的用例,使用包含的对象作为键会更清楚。
具有一个 ThreadLocal
(具有线程特定内容)映射的映射最终会得到 ThreadLocal
(将线程映射到值的映射)的内部映射用于实际映射。
更不用说 ThreadLocal
个实例在某种程度上是不推荐的。他们有的常见用例通过引入"native"threadlocal类来解决,比如java.util.concurrent.ThreadSafeRandom
.
您可以像使用任何其他对象一样将 ThreadLocal
用作 HashMap 键。有没有意义就是另外一个话题了
基本上,如果您使用可变对象作为 HashMap
、HashSet
等对象的键,您可能会遇到问题,因为那些 类 通常使用 hashCode()
(因此得名)将东西放入桶中并取回它。因此,如果您使用可变对象作为键,然后更改对象(以 hashCode 更改的方式),然后尝试通过键检索条目,您将不再找到该条目,因为映射将在错误的存储桶中查找条目。
在 ThreadLocal
的情况下,这不是问题,因为它不会覆盖 equals()
和 hashCode()
,因此 hashCode()
不会改变,如果你更改对象,这样您就可以可以安全地使用ThreadLocal
作为键。