Java中除了对象这种引用类型,还有值类型。
Java为了性能还有一种称为常量池的内存结构,这种用法就是设计模式中的享元模式
因为常量池的出现,一些很容易理解的问题,变得复杂了
本文就来理一理Java中Integer中如何比较大小呢?
前期准备工作(包括相关工具或所使用的原料等)IntelliJ IDEAjavaInteger 详细的操作方法或具体步骤
先看个与预期一致的。
Show the code.
Code:
package chapter4;
/**
* Created by MyWorld on 2016/3/19.
*/
public class IntegerEqalsVerify {
public static void main(String[] args) {
Integer source=127;
Integer target=127;
boolean result=source==target;
System.out.println("scene 1:" + result);
boolean resultForEquals=source.equals(target);
System.out.println("scene 2:" + resultForEquals);
}
}

执行上面的代码。
都是true。这与我们的认知是一致的
Output:
scene 1:true
scene 2:true

把数字大小调整下,都改为128呢?
Code:
Integer source=128;Integer target=128;boolean result=source==target;

执行下,看看结果:
scene 1:false
scene 2:true
傻眼了吧。
为什么是false呢?

只要是比127大的数字。在上面的场景中,执行结果都是一样的
现在就来测个下限,先用数字-128.
执行一下。
可以看到,和平时的认知是一个的,都是true
Code:
Integer source=-128;
Integer target=-128;
boolean result=source==target;

改成-129。
看看执行结果:使用==比较时又不相等了。。。
scene 1:false
scene 2:true
Code:
Integer source=-129;
Integer target=-129;
boolean result=source==target;

为什么呢?
原因就出现在常量池了。
如果Integer的值在[-128,127]时,都会从常量池中取。
这样所有这个区间的Integer的对象是完全相同的,使用==比较肯定是true,因为内存地址是一样的的嘛
过了这个区间的,肯定不同了,不同的对象,内存地址不一样了的。
这种情况下,只能使用Equals来比较。
对象之间比较是否相等,一定要使用Equals
来一块看看java.lang.Integer.IntegerCache
private static class IntegerCache {
static final int high;
static final Integer cache[];
static {
final int low=-128;
// high value may be configured by property
int h=127;
if (integerCacheHighPropValue !=null) {
// Use Long.decode here to avoid invoking methods that
// require Integer's autoboxing cache to be initialized
int i=Long.decode(integerCacheHighPropValue).intValue();
i=Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h=Math.min(i, Integer.MAX_VALUE - -low);
}
high=h;
cache=new Integer[(high - low) + 1];
int j=low;
for(int k=0; k < cache.length; k++)
cache[k]=new Integer(j++);
}
private IntegerCache() {}
}

- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
