我有一个关于比较String和Integer对象的问题......
一个。比较字符串引用:
String string1 = "Hi";
System.out.printf("%s \n", string1);
String originalString = string1;
System.out.printf("%-9s %-9s %b \n", string1, originalString, originalString == string1);
System.out.println();
string1 += " there";
originalString += " there";
System.out.printf("%-9s %-9s %b \n", string1, originalString, originalString.equals(string1));
System.out.printf("%-9s %-9s %b \n", string1, originalString, originalString == string1);
产生输出:
Hi
Hi Hi true
Hi there Hi there true
Hi there Hi there false
这里,最后一行比较地址,并且预期给出错误。 好到目前为止;)
湾比较整数引用:
Integer integer1 = 10;
System.out.printf("%d \n", integer1);
Integer originalInteger = integer1;
System.out.printf("%d %d %b \n", integer1, originalInteger, originalInteger == integer1);
System.out.println();
integer1++;
originalInteger++;
System.out.printf("%d %d %b \n", integer1, originalInteger, originalInteger == integer1);
产生输出:
10
10 10 true
11 11 true
当打印出最后一行时,'integer1'和'originalInteger'都引用了完全不同的对象......不过
originalInteger == integer1 --> true ???
这是否意味着不会比较对象的地址而是比较对象的内容? 换句话说,是否因为使用类型包装器,值在被比较之前总是“未装箱”?
所以,要恢复:
originalString == string1 --> false
originalInteger == integer1 --> true
我不明白为什么originalInteger == integer1 - >真
谢谢
答案 0 :(得分:0)
==
比较对象的引用("地址",正如您所说),正如您对String
示例的理解(正确)。
当您将++
运算符应用于Integer
时,实际上您将其发送到原始int
,将其递增,并将其自动装箱回Integer
,理论上,你可以在那里得到一个不同的对象。但是,Integer
课程会播放“肮脏的”#34;这里的技巧(阅读:整洁优化)。对于最大为127(包括)的值,Java会保留Integer
的缓存,并在此值自动装箱时返回相同的对象。因此,实际上,您将获得相同的对象,因此originalInteger == integer1
将返回true
。如果你用一个更大的整数重复这个例子,让我们说500
,你得到false
就像你期望的那样。