这个问题在这里已经有答案了:
为什么两个原子整数永远不相等(9个答案)
四年前关门了。
我在官方文件里找不到任何信息。我知道 Boolean.hashCode(boolean b)
返回true和false的两个素数1231和1237。我希望在中国也能得到类似的实施 AtomicBoolean
. 但在反编译的类文件中,它似乎调用 public native int hashCode();
的 Object
-这是否意味着它将返回内存位置?
这个问题在这里已经有答案了:
为什么两个原子整数永远不相等(9个答案)
四年前关门了。
我在官方文件里找不到任何信息。我知道 Boolean.hashCode(boolean b)
返回true和false的两个素数1231和1237。我希望在中国也能得到类似的实施 AtomicBoolean
. 但在反编译的类文件中,它似乎调用 public native int hashCode();
的 Object
-这是否意味着它将返回内存位置?
4条答案
按热度按时间uyhoqukh1#
包摘要说明了原因
hashCode
不为覆盖AtomicBoolean
:原子类不是java.lang.integer和相关类的通用替代品。它们不定义方法,例如
equals
,hashCode
以及compareTo
. (因为原子变量预期会发生变异,所以它们是哈希表键的糟糕选择。)这是否意味着它将返回内存位置?
这取决于您使用的jvm,但是是的,它通常是从内存地址派生的。其他JVM可能只使用一个随机数。
ui7jx7zq2#
atomicboolean不重写hashcode(或equals),因此它继承默认的对象行为。
这其实很有道理。hashcode的主要使用情形是让对象成为hashMap的键,但是一旦键在Map中就改变它们是危险的。由于atomicboolean的主要属性是它的可变性,这使得它不适合作为hashmap键。
换句话说:如果需要它作为hashmap键,就不应该对它进行变异,如果不打算对它进行变异,就不应该使用atomicboolean。
kyvafyod3#
AtomicBoolean
不重写hashCode()
(或equals(Object)
,为此)方法。它使用来自的默认实现java.lang.Object
. 尽管jls没有指定它,但是这个实现通常只返回表示为int
.6g8kf2rb4#
atomicboolean使用对象方法的hashode,该hashode在类中不被重写,因此它使用对象类的defult hascode。