为什么下面的代码会为 long3 == long2 比较返回 false ,即使它是文字的。
public class Strings {
public static void main(String[] args) {
Long long1 = 256L + 256L;
Long long2 = 512L;
Long long3 = 512L;
System.out.println(long3 == long2);
System.out.println(long1.equals(long2));
}
}
答案 0 :(得分:62)
Long
是一个对象,而不是一个原始对象。使用==
,您需要比较参考值。
你需要这样做:
if(str.equals(str2))
正如你在第二次比较中所做的那样。
编辑:我明白了......您认为其他对象就像String
文字一样。他们不是*。即便如此,您也绝不想将==
与String
文字一起使用。
(* Autobox类型确实实现了flyweight模式,但仅适用于值-128 - > 127.如果您使Long
等于50
,您确实会有两个相同的flyweight引用再次,永远不会使用== 来比较它们。)
编辑添加:这在Java语言规范中明确说明,Section 5.1.7:
如果装箱的值p为真,假,字节或范围为\ u0000到\ u007f的字符,或者介于-128和127(含)之间的整数或短数,则让r1和r2为p的任意两次拳击转换的结果。始终是r1 == r2。
的情况
请注意,long
不特别提及,但当前的Oracle和OpenJDK实现(1.6和1.7),这是从不的另一个原因使用==
Long l = 5L;
Long l2 = 5L;
System.out.println(l == l2);
l = 5000L;
l2 = 5000L;
System.out.println(l == l2);
输出:
真
假
答案 1 :(得分:3)
您还可以使用以下方法从Long对象中获取原始值:
str.longValue()
答案 2 :(得分:3)
如果你想做
str3==str2
这样做..
str3.longValue()==str2.longValue()
这可以更快地实现您的目的,因为您要比较两个基本类型值而不是对象。
答案 3 :(得分:0)
这里Long是一个Wrapper类,所以下面的行将比较引用而不是内容。
long3 == long2
与下面的** .longValue()**比较
总是更好 long3.longValue() == long2.longValue()
如果我们使用in-build equal()方法,也会使用null check做同样的事情。
long3.equals(long2)
以下是java
中 equals()的内部实现public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}