Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java ThreadLocal可以用作HashMap中的键吗?_Java_Hashmap_Thread Local - Fatal编程技术网

Java ThreadLocal可以用作HashMap中的键吗?

Java ThreadLocal可以用作HashMap中的键吗?,java,hashmap,thread-local,Java,Hashmap,Thread Local,ThreadLocal可以用作HashMap中的键吗 如果是这样的话,它是如何工作的?它通常是一个坏主意吗?我应该注意什么 正如Jaroslaw Pawlak所评论的,由于ThreadLocal没有实现hashCode()和equals(),因此它不适合HashMap中的键,至少如果您希望它表现良好的话 即使有,也没用。考虑到ThreadLocal的用例,使用包含的对象作为键将更加清晰 拥有一个带有一个ThreadLocal(具有特定于线程的内容)映射的映射只会导致实际映射使用ThreadLoc

ThreadLocal可以用作HashMap中的键吗


如果是这样的话,它是如何工作的?它通常是一个坏主意吗?我应该注意什么

正如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这个问题没有根据。基于这一点(或者更确切地说是缺乏它),我说“仅仅因为你可以,你就可以。”