[英]java Long datatype comparison
为什么下面的代码对于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));
}
}
Long
是一个对象,而不是一个原始对象。 通过使用==
您将比较参考值 。
你需要这样做:
if(str.equals(str2))
正如你在第二次比较中所做的那样。
编辑:我明白了......你在想其他对象就像String
文字一样。 他们不*。 即使这样,你也不想使用==
with String
literals。
(* Autobox类型确实实现了flyweight模式,但仅用于值-128 - > 127.如果你使Long
等于50
你确实会有两个对同一flyweight对象的引用。再次, 永远不要使用==来比较它们。)
编辑添加:这在Java语言规范的第5.1.7节中有具体说明:
如果被装箱的值p为真,假,字节或范围为\\ u0000到\\ u007f的字符,或介于-128和127(含)之间的int或短数,则让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);
输出:
真正
假
您还可以使用以下方法从Long对象中获取原始值:
str.longValue()
如果你想做
str3==str2
这样做..
str3.longValue()==str2.longValue()
这样可以更快地实现您的目的,因为您要比较两个基本类型值而不是对象。
这里Long是一个Wrapper类,所以下面的行将比较引用而不是内容。
long3 == long2
它总是比** .longValue()**更好,如下所示
long3.longValue() == long2.longValue()
如果我们使用in-build equal()方法,也会使用null检查执行相同的操作。
long3.equals(long2)
下面是java中equals()的内部实现
public boolean equals(Object obj) {
if (obj instanceof Long) {
return value == ((Long)obj).longValue();
}
return false;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.