a < b
并且a - b < 0
可能意味着两个不同的东西。考虑以下代码:
int a = Integer.MAX_VALUE;
int b = Integer.MIN_VALUE;
if (a < b) {
System.out.println("a < b");
}
if (a - b < 0) {
System.out.println("a - b < 0");
}
运行时,将仅打印a - b < 0
。发生的事情a < b
显然是错误的,但是a - b
溢出并变为-1
,这是负面的。
话虽如此,请考虑一下数组的长度确实接近Integer.MAX_VALUE
。中的代码ArrayList
如下所示:
int oldCapacity = elementData.length;
int newCapacity = oldCapacity + (oldCapacity >> 1);
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
oldCapacity
确实接近,Integer.MAX_VALUE
所以newCapacity
(是oldCapacity + 0.5 * oldCapacity
)可能溢出并变成Integer.MIN_VALUE
(即负数)。然后,将minCapacity
下溢 相减回正数。
此检查确保if
不会执行。如果代码编写为if (newCapacity < minCapacity)
,则true
在这种情况下(由于newCapacity
为负)newCapacity
将被强制执行,minCapacity
而与无关oldCapacity
。
此溢出情况由下一个if处理。当newCapacity
已经溢出,这将是true
:MAX_ARRAY_SIZE
被定义为Integer.MAX_VALUE - 8
和Integer.MIN_VALUE - (Integer.MAX_VALUE - 8) > 0
的true
。将newCapacity
因此被正确地处理:hugeCapacity
方法返回MAX_ARRAY_SIZE
或Integer.MAX_VALUE
。
注意:这就是// overflow-conscious code
此方法中的注释。
我正在读费多尔·皮库斯的这本书,他有一些非常非常有趣的例子,对我来说是一个惊喜。 特别是这个基准抓住了我,唯一的区别是,在其中一个基准中,我们在if中使用||,在另一个基准中,我们使用|. 我不会详细介绍书中解释的为什么后者更快的所有细节,但我的想法是,在较慢的版本和|(按位或)版本中,硬件分支预测器有两次错误预测的机会。请参见下面的基准测试结果。 所以问题是为什么我们不在分支中总是使用|而不是|
问题内容: List listStr = new ArrayList (); 与 在我看来,使用的好处之一是它不检查列表的大小,然后将其与零进行比较,它只是检查列表是否为空。是否有任何其他的优点,因为我经常看到的,而不是在代码库?是否存在我不知道以这种方式检查的原因? 问题答案: 基本上,在某些列表的实现中,该方法检查大小是否为零(因此从性能的角度来看,它们实际上是等效的)。但是,在其他类型的列表
问题内容: 我今天偶然地写了一些代码,当Eclipse一次不对我大吼时,我感到很惊讶。该代码对结构相等运算符()有双重使用,类似于下面的结构。 输出是 玩耍时,我注意到我除了不能使用任何类型。从这个布尔表达式是 简化为。 因此,忽略副作用等于。 谁能解释该语法如何暗示这一点? 编辑1: 在许多人解释了左联想性之后,我发现我的困惑在哪里。通常,我将“ 1”表示为true,将“ 0”表示为false,
本文向大家介绍C# if, if...else, if... else if ,包括了C# if, if...else, if... else if 的使用技巧和注意事项,需要的朋友参考一下 示例 该if语句用于控制程序的流程。一条if语句根据Boolean表达式的值标识要运行的语句。 对于单个语句,braces{}是可选的,但建议使用。 该if还可以有一个else条款,将在案件条件的计算结果来执
问题内容: 为什么以下两个语句的结果不同? 编辑: 我应该补充一点,我怀疑将“ 0”第一条语句强制转换为要比较的布尔值-这应该与“‘0’== true”完全相同,显然这是不正确的。 问题答案: 首先,为了完整性: 是的,因为是一个非空字符串,这始终计算结果为: 字符串:如果参数为空字符串(其长度为零),则结果为 false; 否则为 false 。否则结果为 true 。 现在到。 这里将进行两次