我正在写一个类Vec2D
,表示一个二维向量。我存储x
和y
在double
。
当要求生成equals(Object obj
和时hashCode()
,eclipse生成了以下内容:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
long temp;
temp = Double.doubleToLongBits(x);
result = prime * result + (int) (temp ^ (temp >>> 32));
temp = Double.doubleToLongBits(y);
result = prime * result + (int) (temp ^ (temp >>> 32));
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Vec2D other = (Vec2D) obj;
if (Double.doubleToLongBits(x) != Double.doubleToLongBits(other.x))
return false;
if (Double.doubleToLongBits(y) != Double.doubleToLongBits(other.y))
return false;
return true;
}
什么是意义Double.doubleToLongBits(x)
在这方面?我不能简单地写x != other.x
吗?
简短答案:Eclipse使用
Double.doubleToLongBits,
因为这就是Double.equals的作用:
结果是,
true
当且仅当参数不是,null
并且是一个Double对象,该对象表示与该对象表示的doubl
值相同的e
double
。为此,double
当且仅当该方法应用于每个值时doubleToLongBits(double)
返回相同的long
值时,两个值才被视为相同。
长答案:JLS指定Double.equals和==之间的一些区别。对于JLS
4.2.3
和JLS
15.21.1中指定的一个区别:
正零和负零比较相等;因此,表达式的结果
0.0==-0.0
为true
和的结果0.0>-0.0
为false
。但是其他运算可以区分正零和负零;例如,1.0/0.0
具有正无穷大的值,而1.0/-0.0
具有负无穷大的值。
另一个方面NaN
:
如果任一操作数为NaN,则结果为
==
为,false
但结果!=
为true
。确实,检验
x!=x
是true
当且仅当x的值为NaN时。
如您所见, 当在数学表和哈希表中使用 两个双精度值时==
, 它们可能会比较, 但实际上对应于不同的行为
。因此,在编写生成的相等方法时,Eclipse假定两个双精度仅在且仅当可以对它们执行的所有操作都相同,或者(等效地)自动装箱并与其equals
方法进行比较时才相等。如果在double
和之间切换,这一点尤其重要Double
-相等属性在那里差异会特别令人意外。
当然,您可以自由地摆脱这种假设:不管这是一个好主意,您都可以将特殊情况分配给许多可能的NaN表示形式,在这种情况下,这Double.doubleToRawLongBits()
将是您equals
和hashCode
方法更好的匹配方式。同样,您的用例可能会将+0.0和-0.0的对象视为等效对象,并保证不可能使用NaN值,在这种情况下,原始==
比较可能会更好equals
(但是在这一点上,模拟相同的条件hashCode
变得很困难)。
问题内容: jQuery和其他框架添加以下标头: X-Requested-With:XMLHttpRequest 为什么需要这个?为什么服务器要对AJAX请求与常规请求区别对待? 更新 :我刚刚找到了一个使用此标头的真实示例:https : //core.spreedly.com/manual/payment-methods/adding- with-js 。如果要求付款处理器不使用AJAX,则完
我有以下X射线过滤器: 它工作得很好,除了我想要这样的东西: 问题是如何编写X射线过滤器/查询,以便URL不包含特定字符串。 谢谢Brian
问题内容: 我想找到一个SQL查询来查找其中field1不包含$ x的行。我怎样才能做到这一点? 问题答案: 这是什么领域?IN运算符不能与单个字段一起使用,而应与子查询或预定义列表一起使用: 如果要搜索字符串,请使用LIKE运算符(但这会很慢): 如果将其限制为要搜索的字符串必须以给定的字符串开头,则可以使用索引(如果该字段上有索引)并且速度相当快:
本文向大家介绍Python程序生成一个字典,该字典包含(x,x * x)形式的数字(1到n之间)。,包括了Python程序生成一个字典,该字典包含(x,x * x)形式的数字(1到n之间)。的使用技巧和注意事项,需要的朋友参考一下 当需要以特定形式生成包含给定范围内的数字的字典时,请从用户处获取输入,并使用简单的“ for”循环。 示例 以下是相同的演示- 输出结果 解释 该数字作为用户输入。 创
基于此,我认为我应该完全开始在中使用