原始长值127和128
我想使用if
条件比较两个Long对象值。 当这些值小于128时 , if
条件正常工作,但是当它们大于或等于128时 ,比较失败。
例:
Long num1 = 127;
Long num2 = 127;
if (num1 == num2) {
// Works ok
}
上面的代码比较正常工作,但在下面的代码中失败:
Long num1 = 128;
Long num2 = 128;
if (num1 == num2) {
// Does NOT work
}
为什么比较Long变量与大于127的值有问题? 如果变量数据类型更改为长基元 ,则比较适用于所有情况。
为什么在比较Long值大于127的变量时存在问题? 如果上述变量的数据类型是原始的(长),那么代码适用于所有值。
Java缓存Integer对象实例,范围从-128到127 。 这就是说:
127
(缓存),则所有引用都会指向同一个对象实例。 (N个变量,1个实例) 128
(未缓存),则每个引用都会指向一个对象实例。 (N个变量,N个实例) 这就是为什么这样:
Long val1 = 127L;
Long val2 = 127L;
System.out.println(val1 == val2);
Long val3 = 128L;
Long val4 = 128L;
System.out.println(val3 == val4);
输出这个:
真正
假
对于127L值,由于两个引用(val1和val2)都指向内存中的同一对象实例(缓存),所以它返回true
。
另一方面,对于128值,由于没有实例将其缓存在内存中,因此为盒装值的任何新赋值创建一个新实例,从而生成两个不同的实例(由val3和val4指向)并返回false
他们之间的比较。
发生这种情况的唯一原因是您将两个Long
对象引用 (不是long
原始值)与==
运算符进行比较。 如果不是这种Cache机制,这些比较总是会失败,所以真正的问题是将盒装值与==
运算符进行比较。
将这些变量更改为原始long
类型将防止发生这种情况,但如果需要使用Long
对象保留代码,则可以使用以下方法安全地进行这些比较:
System.out.println(val3.equals(val4)); // true
System.out.println(val3.longValue() == val4.longValue()); // true
System.out.println((long)val3 == (long)val4); // true
国际海事组织 ,在处理对象比较时坚持使用.equals()方法总是一个好主意。
免责声明:如果这些值中的任何一个为空(即使强制转换为抛出异常),大多数比较都会失败,因此需要额外的检查来适应这些情况。
参考链接:
num1
和num2
是长对象。 你应该使用equals()
来比较它们。 ==
比较可能有时会因为JVM框元素的方式而起作用,但不依赖于它。
if (num1.equals(num1))
{
//code
}
Java将原始值从-128缓存到127 。 当我们比较两个Long对象java内部类型时,将它转换为原始值并进行比较。 但是在127以上,Long对象不会获得类型种姓。 Java通过.valueOf()方法缓存输出。
此缓存适用于从-128到127的Byte,Short,Long。对于Integer缓存可以从-128到java.lang.Integer.IntegerCache.high或127,取其中较大的一个(我们可以设置最高级别的值为整数值应该通过使用java.lang.Integer.IntegerCache.high来缓存)。
For example:
If we set java.lang.Integer.IntegerCache.high=500;
then values from -128 to 500 will get cached and
Integer a=498;
Integer b=499;
System.out.println(a==b)
Output will be "true".
Float和Double对象永远不会被缓存。
字符将从0到127缓存
你正在比较两个对象。 所以==运算符将检查对象引用的相等性。 有以下几种方法可以做到这一点。
1)类型将这两个对象转换为原始值并进行比较
(long)val3 == (long)val4
2)读取对象的值并进行比较
val3.longValue() == val4.longValue()
3)在对象比较中使用equals()方法。
val3.equals(val4);
链接地址: http://www.djcxy.com/p/10045.html