我查看了java.lang.Math
源代码中的一些内容,并注意到虽然math.min(int,int)
(或其长的对应部分)是这样实现的:
public static int min(int a, int b) {
return a <= b ? a : b;
}
这对我来说是完全有意义的,这和我想做的是一样的。但是,double/float的实现是这样的:
public static float min(float a, float b) {
if (a != a) {
return a;
} else if (a == 0.0F && b == 0.0F && (long)Float.floatToRawIntBits(b) == negativeZeroFloatBits) {
return b;
} else {
return a <= b ? a : b;
}
}
我完全傻眼了。是否将A
与其自身进行比较?第二张支票是为了什么?为什么它的实现方式不像int/long版本一样?
浮点数比整数值复杂得多。
对于这一具体情况,有两个区别是重要的:
nan
是float
和double
的有效值,它表示“不是数字”,并且行为怪异。即它与自身不相等。所以这部分:
if (a != a) {
return a;
}
确保如果a
是nan
(如果a
不是nan
而是b
是,则稍后的“正常”检查将返回b
,即nan
,因此在这种情况下不需要显式检查),则返回nan
。这是一种常见的模式:当计算输入为nan
的任何东西时,输出也将是nan
。由于nan
通常表示计算中的某些错误(例如将一个值除以0),因此重要的是它“毒害”了所有进一步的计算,以确保错误不会被默默吞噬。
此部分:
if (a == 0.0F && b == 0.0F && (long)Float.floatToRawIntBits(b) == negativeZeroFloatBits) {
return b;
}
确保如果与零值浮点数进行比较,并且b
为负零,则返回该负零(因为-0.0“小于”0.0)。与nan
类似,如果a
为-0.0,而b
为0.0,则正常检查将正确返回a
。
问题内容: 我正在研究Java标准库(6)中compare(double,double)的实现。内容为: 此实现的优点是什么? 编辑:“优点”是一个(非常)错误的单词选择。我想知道这是如何工作的。 问题答案: @Shoover的答案是正确的(阅读它!),但是它还不止于此。 由于javadoc中的规定: “此定义允许哈希表正常运行。” 假设Java设计者决定采用与包装实例相同的语义来实现。这意味着将
在添加新的键值对时,我有几个关于重建哈希映射的问题。我将根据这些事实提出问题(它们对于Oracle JVM是正确的,不确定它们对于其他JVM是否正确): 每次当HashMap增长大于阈值(阈值=加载因子*条目数)时,Resize将重建HashMap,使其具有更大的内部表数组。新创建的条目放在哪个存储桶中并不重要,Map仍然会变得更大。即使所有条目都进入一个bucket(即它们的键“返回相同的数字)
我们知道Java 8引入了一个新的流API和Java。util。流动收集器是定义如何聚合/收集数据流的接口。 但是,收集器接口的设计如下: 为什么它不是这样设计的? 后者更容易实现。把它设计成前者的考虑是什么?
我正在看宣传单。 在setTimeout中调用
我想知道为什么下面的代码: 我被要求详细解释,但我不明白为什么输出是这样的。请有人帮帮我。