Java自动装箱规则
我是一个java新手,所以被下面的示例弄糊涂了。可以认为“==”符号将比较整数和int中的“自动装箱”整数之间的值,并比较整数之间的引用地址吗 双打和0/0怎么样Java自动装箱规则,java,autoboxing,Java,Autoboxing,我是一个java新手,所以被下面的示例弄糊涂了。可以认为“==”符号将比较整数和int中的“自动装箱”整数之间的值,并比较整数之间的引用地址吗 双打和0/0怎么样 import edu.princeton.cs.introcs.*; public class Autoboxing { public static void cmp(Integer first, Integer second) { if (first < second) St
import edu.princeton.cs.introcs.*;
public class Autoboxing {
public static void cmp(Integer first, Integer second) {
if (first < second)
StdOut.printf("%d < %d\n", first, second);
else if (first == second)
StdOut.printf("%d == %d\n", first, second);
else if (first > second)
StdOut.printf("%d > %d\n", first, second);
else
StdOut.printf("%d and %d are incomparable\n", first, second);
}
public static void main(String[] args) {
cmp(new Integer(42), 43);
cmp(new Integer(42), new Integer(42));
cmp(43, 43);
cmp(142, 142);
Integer a0 = 1000;
int b0 = 1000;
Integer c0 = 1000;
StdOut.println("a0==b0?" + (a0==b0));
StdOut.println("a0==c0?" + (a0==c0));
StdOut.println("b0==c0?" + (b0==c0));
double x1 = 0.0, y1 = -0.0;
Double a1 = x1, b1 = y1;
StdOut.println(x1 == y1);
StdOut.println(a1.equals(b1));
double x2 = 0.0/0.0, y2 = 0.0/0.0;
Double a2 = x2, b2 = y2;
StdOut.println(x2 != y2);
StdOut.println(!a2.equals(b2));
}
}
import-edu.princeton.cs.introcs.*;
公共类自动装箱{
公共静态无效cmp(整数优先,整数第二){
如果(第一次<第二次)
StdOut.printf(“%d<%d\n”,第一,第二);
else if(第一个==第二个)
printf(“%d==%d\n”,第一,第二);
else if(第一个>第二个)
printf(“%d>%d\n”,第一,第二);
其他的
printf(“%d和%d不可比较\n”,第一,第二);
}
公共静态void main(字符串[]args){
cmp(新的整数(42),43);
cmp(新整数(42),新整数(42));
cmp(43,43);
化学机械抛光(142142);
整数a0=1000;
int b0=1000;
整数c0=1000;
println(“a0==b0?”+(a0==b0));
标准输出println(“a0==c0?”+(a0==c0));
println(“b0==c0?”+(b0==c0));
双x1=0.0,y1=-0.0;
双a1=x1,b1=y1;
StdOut.println(x1==y1);
标准输出ln(a1等于(b1));
双x2=0.0/0.0,y2=0.0/0.0;
双a2=x2,b2=y2;
StdOut.println(x2!=y2);
StdOut.println(!a2.等于(b2));
}
}
结果是:
42 < 43
42 and 42 are incomparable
43 == 43
142 and 142 are incomparable
=====
a0==b0?true
a0==c0?false
b0==c0?true
=====
true
false
=====
true
false
42<43
42和42是无与伦比的
43 == 43
142和142是无与伦比的
=====
a0==b0?为真
a0==c0?错误
b0==c0?为真
=====
真的
假的
=====
真的
假的
以下是您的教程
你也可以通过
0.0/0.0
是NaN
至少在数学上你不能比较无穷大。我想这就是为什么这个比较不起作用的原因
从
正零和负零比较相等;因此,表达式0.0==-0.0的结果为真,0.0>-0.0的结果为假
NaN是无序的,因此:
- 数值比较运算符=如果
一个或两个操作数均为NaN(§15.20.1)
- 如果任一操作数为NaN,则相等运算符==返回false
- 特别是,如果x或y为NaN,(x=y)将为假
- 不等式运算符!=如果任一操作数为NaN(§15.21.1),则返回true
- 特别是,x=当且仅当x为NaN时,x为真
如果您检查方法,它有两个例外
也有真正的价值。但是,有两个例外:
- 如果d1和d2都表示Double.NaN,那么equals方法
返回true,即使Double.NaN==Double.NaN的值为false
- 如果d1代表+0.0,而d2代表-0.0,反之亦然,则即使+0.0==-0.0的值为真,相等测试的值也为假
此定义允许哈希表正常运行。==
只能用于检查变量是否相等(如果变量是基元类型)。对于对象变量,=
用于比较对象的引用。如果要比较对象的值,请使用.equals()
方法。我不建议将装箱整数与==进行比较,因为它仅适用于某些值。当出现算术运算符时,将进行取消装箱操作
例如:
但当==
出现时,这取决于具体情况
如果装箱类型出现在两侧
,它将比较参考
。但是如果基本类型出现在一侧
,而另一侧是装箱类型,则装箱类型将取消装箱
例如:
PS:InJava.lang.Integer
Cache,支持JLS要求的-128和127(含)之间的值的自动装箱的对象标识语义。
因此:
你试过了吗?System.out.println(“eq”+(新整数(10)=10));这里解释的答案谢谢~所以a2和b2都是布尔值false,因此彼此相等?a2。如果两者都是NAN
,则equals(b2)
将始终返回true,这在Java doc of equals方法中有记录。我也在阅读文章,似乎对于int,==比较了-127-127之间的值。是的。这是一种缓存。当你有整数时使用.equals(),当你有整数时使用==但是为什么objectO1=3代码>对象o2=3代码>System.out.println(o1==o2)代码>返回true
?==
的两侧都是装箱类型这是由于整数缓存造成的。在引擎盖下,编译器将上述赋值替换为Object o1=Integer.valueOf(3)代码>和<代码>对象o2=整数。值(3)代码>。Integer.valueOf(int)的实现保存Integer的某些实例以供重用。因此,尽管==运算符两侧的两个对象从未解除绑定,但它们具有相同的引用。更多:
Integer a = 10;
a = a+10; //1.unboxing a to int 2.calculate a+10 3.boxing 20 to Integer.
System.out.print(a > 10); //1.unboxing a to int 2. compare
Integer a = new Integer(129);
Integer b = new Integer(129);
System.out.println(a == b); // compare reference return false
System.out.println(a == 129); // a will unboxing and compare 129 == 129 return true
Integer a = 127;
Integer b = 127; //cached, the same as b a==b return ture
Integer c = 129;
Integer d = 129; // not cached, c==d return false