Integer

来源:互联网 发布:大疆地面站软件下载 编辑:程序博客网 时间:2024/05/29 05:55

Integer

Integer a = 100, b = 100;Integer c = 1000,d = 1000;System.out.println(a == b);//trueSystem.out.println(c == d);//false

==比较的是两个对象的引用。
a、b、c、d都是新创建的对象,为什么不输出两个false?
参阅Integer.java这个类:

public static Integer valueOf(int i) {    return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];}/** * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing */private static final Integer[] SMALL_VALUES = new Integer[256];static {    for (int i = -128; i < 128; i++) {        SMALL_VALUES[i + 128] = new Integer(i);    }}

声明Integer a = 100;会自动装箱,也就是调用的valueOf()方法把基本数据类型转换成Integer对象。
为优化性能,Integer中把-128-127 使用的频率比较高的小的数字缓存了下来。
当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。


Integer和int

Integer a = new Integer(1000);int b = 1000;Integer c = new Integer(10);Integer d = new Integer(10);System.out.println(a == b);//trueSystem.out.println(c == d);//false

先看第二个,既然Integer把-128-127缓存起来,为什么这里不是true?因为这里的Integer是new出来的,并不是用的缓存,所以结果是false。
再看第一个,为什么是true?首先值为1000,可见与Integer缓存无关系。注意b是int类型。当int和Integer进行==比较的时候,Java会把Integer进行自动拆箱,转成int类型,所以这里进行比较的是int类型的值。

0 0
原创粉丝点击