Java ThreadLocal可以用作HashMap中的键吗?
ThreadLocal可以用作HashMap中的键吗Java ThreadLocal可以用作HashMap中的键吗?,java,hashmap,thread-local,Java,Hashmap,Thread Local,ThreadLocal可以用作HashMap中的键吗 如果是这样的话,它是如何工作的?它通常是一个坏主意吗?我应该注意什么 正如Jaroslaw Pawlak所评论的,由于ThreadLocal没有实现hashCode()和equals(),因此它不适合HashMap中的键,至少如果您希望它表现良好的话 即使有,也没用。考虑到ThreadLocal的用例,使用包含的对象作为键将更加清晰 拥有一个带有一个ThreadLocal(具有特定于线程的内容)映射的映射只会导致实际映射使用ThreadLoc
如果是这样的话,它是如何工作的?它通常是一个坏主意吗?我应该注意什么 正如Jaroslaw Pawlak所评论的,由于
ThreadLocal
没有实现hashCode()
和equals()
,因此它不适合HashMap
中的键,至少如果您希望它表现良好的话
即使有,也没用。考虑到ThreadLocal
的用例,使用包含的对象作为键将更加清晰
拥有一个带有一个ThreadLocal
(具有特定于线程的内容)映射的映射只会导致实际映射使用ThreadLocal
(将线程映射到值的映射)的内部映射
更不用说
ThreadLocal
实例在某种程度上是不推荐的。正如Jaroslaw Pawlak评论的那样,通过引入“本机”threadlocal类解决了它们的常见用例,例如java.util.concurrent.ThreadSafeRandom
,因为threadlocal
没有实现hashCode()
和equals()
它不适合HashMap
中的键,至少如果您希望它表现良好
即使有,也没用。考虑到ThreadLocal
的用例,使用包含的对象作为键将更加清晰
拥有一个带有一个ThreadLocal
(具有特定于线程的内容)映射的映射只会导致实际映射使用ThreadLocal
(将线程映射到值的映射)的内部映射
更不用说
ThreadLocal
实例在某种程度上是不推荐的。通过引入“本机”threadlocal类(如java.util.concurrent.ThreadSafeRandom
)解决了它们的常见用例。您可以像任何其他对象一样使用threadlocal
作为HashMap键。它是否有意义是另一个话题
基本上,如果使用可变对象作为HashMap
、HashSet
等的键,您可能会遇到问题,因为这些类通常使用hashCode()
(因此得名)将内容放入桶中并检索它。因此,如果您使用可变对象作为键,然后更改对象(以哈希代码更改的方式),然后尝试按键检索条目,您将无法再找到条目,因为映射将在错误的bucket中查找条目
在
ThreadLocal
的情况下,这不会是一个问题,因为它不会覆盖equals()
和hashCode()
,因此如果更改对象,hashCode()
将不会更改,因此,您可以安全地使用ThreadLocal
作为键。您可以像任何其他对象一样使用ThreadLocal
作为HashMap键。它是否有意义是另一个话题
基本上,如果使用可变对象作为HashMap
、HashSet
等的键,您可能会遇到问题,因为这些类通常使用hashCode()
(因此得名)将内容放入桶中并检索它。因此,如果您使用可变对象作为键,然后更改对象(以哈希代码更改的方式),然后尝试按键检索条目,您将无法再找到条目,因为映射将在错误的bucket中查找条目
在
ThreadLocal
的情况下,这不会是一个问题,因为它不会覆盖equals()
和hashCode()
,因此如果您更改对象,hashCode()
将不会更改,因此您可以安全地使用ThreadLocal
作为键。这听起来是一个非常糟糕的主意ThreadLocal
实例并不打算以这种方式使用,这在很大程度上取决于它的equals
方法,该方法可能会根据调用它的线程给出不同的结果。为什么不直接使用ThreadLocal
所持有的值呢?快速查看后,我发现ThreadLocal
没有实现等于和hashCode
方法。所以它不会起作用。@JaroslawPawlak我已经试过了,它只会起作用fine@JaroslawPawlak它的工作方式与IdentityHashMap
相同。问题是它是否有任何意义。OP应该提供一个用例。“我应该注意什么?”-被奇怪的假设问题惹恼的斧头杀人犯:-)这听起来真是个糟糕的主意ThreadLocal
实例并不打算以这种方式使用,这在很大程度上取决于它的equals
方法,该方法可能会根据调用它的线程给出不同的结果。为什么不直接使用ThreadLocal
所持有的值呢?快速查看后,我发现ThreadLocal
没有实现等于和hashCode
方法。所以它不会起作用。@JaroslawPawlak我已经试过了,它只会起作用fine@JaroslawPawlak它的工作方式与IdentityHashMap
相同。问题是它是否有任何意义。OP应该提供一个用例。“我应该注意什么?”-被奇怪的假设问题惹恼的斧头杀人犯:-)没有覆盖hashCode
和等于的对象的行为有什么问题?它只是一个基于身份的散列映射。如果你使用同一个对象,它的行为是完美的。@realponsust完全正确,所以我认为这个答案是错误的。:-)因为如果您想要IdentityHashMap
,您应该显式地使用它。使用常规的HashMap
和附加的ThreadLocal
奇怪的编程是不清楚的。@vamper这个问题没有根据。基于这一点(或者更确切地说是缺乏它),我说“仅仅因为你可以,你就可以。”