为什么Java库中的静态方法compare
forLong
、Integer
和Short
的实现不同?
对于长
:
public static int compare(long x, long y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
对于整数
:
public static int compare(int x, int y) {
return (x < y) ? -1 : ((x == y) ? 0 : 1);
}
对于Short
:
public static int compare(short x, short y) {
return x - y;
}
int的值可以介于[-2147483648、2147483647]
之间。如果从2147483647
中减去-2147483648
,您将得到4294967295
。这不能存储在整数中,因此我们使用它来比较两个整数
return (x < y) ? -1 : ((x == y) ? 0 : 1);
long的情况也是如此。
x-y
大概是最有效的(因为替代方案涉及两次分支),所以这用于short
。
但是x-y
不能用于int
或long
,因为当结果值不适合int
时,这将溢出,当结果应该是负值,或者当结果应该为正时为负值(在任何一种情况下都为零)。
注意:当减去两个short
s时,结果值的类型为int
,因此永远不会溢出。
// long - long
System.out.println((int)(2147483649l - 1l)); // -2147483648, not 2147483648
// int - int
System.out.println(-2147483648 - 1); // 2147483647, not -2147483649
// int - int
System.out.println(1 - -2147483648); // -2147483647, not 2147483649
// short - short
short s1 = -32768, s2 = 1;
System.out.println(s1 - s2); // -32769, as desired
值得一提的是:之所以选择上述值,是因为它们大致在int
(和short
)的最小值和最大值附近,以演示它在哪个点溢出。
如果你尝试:
System.out.println(Long.MIN_VALUE - Long.MAX_VALUE);
或
System.out.println(Integer.MIN_VALUE - Integer.MAX_VALUE);
你会得到1
,因为溢出(更新:这里应该是下溢,如另一个答案所述),这是不正确的。
然而
System.out.println(Short.MIN_VALUE - Short.MAX_VALUE);
您将获得正确的值-65535
,因为短
将在-
操作之前转换为int
,从而防止溢出。
我的代码超时了,因为它效率低下。程序接受一行n个整数。每对连续的整数代表一个点(x,y)。这是一个输入示例: -5 -10 20 25 30 2 -1 -40 输出: 我有代码来排序所有的点。它们从最小到最大排序。如果"x"值相等,则检查y值。问题是:我需要计算一个点比其他点(x和y)大多少倍。所以在上面的例子中,答案是4。 > 第三点比第一点和第二点大。 结果是4。 如果点相等,也增加计数器。
当执行下面的代码段时,它对double的行为不同。 为什么Double的行为与long不同?
我有一个类字段,和。我需要使用对它们进行排序,但我得到了一个异常: java.lang.IllegalArgumentException:比较方法违反了它的一般约定! 我的< code>compareTo方法: 请帮我找出compareTo方法中的错误。谢了。
上述情况导致 上述条件返回。 为什么会这样?这些片段之间有什么区别?
问题内容: 我有以下代码 这是输出 现在我意识到float和int是不同的,但是考虑到四舍五入,我本来希望两个值匹配。我已经通过强制转换为int解决了它。 所以我的问题是,为什么这个比较不能像我期望的那样工作(两个值都匹配)? 问题答案: 请注意PHP手册中的 红色大警告 ! 比较浮点数时不要指望任何东西。即使精度为0,舍入结果仍然是浮点数。在您的特定情况下,碰巧结果要比预期的大一点,因此强制转换
问题内容: 我是Java的新手,我刚刚读了一个整数类的变量,可以用API的三种不同方式来描述。我有以下代码: 这是在循环内,只是输出。 我的目标是弄清楚如何查看整数值。 我知道这是正确的方法吗?还是它? 我知道这是不正确的。这是正确的吗?是否存在值比较运算符? 问题答案: 整数是自动拆箱的,因此您可以执行