前言:
今天看到了一道面试题,就是关于Integer定义的两个变量进行比较,觉得挺有意义的,所以作此记录。
题目介绍
Integer a = 100;
Integer b = 100;
System.out.println(a==b);
Integer c = 128;
Integer d = 128;
System.out.println(c==d);
上面的代码,运行结果是多少?
正确的运行结果如下:
为什么会这样呢?下面我们就来分析以下。
分析
基本数据类型,通过==比较的是他们的值大小,而引用类型比较的是他们的引用地址。
所以初看这道题,我们都会认为结果应该为两个false,因为Integer是一个类呀,a、b是引用类型,内存地址应该是不同的呀,为什么相同了,所以我们进入源码看一下怎么回事。
当我们给一个Integer赋予一个int类型的时候会调用Integer的静态方法valueOf。
我们还看到Integer范围是 “-128~127”,当i在这个范围内是从IntegerCache中直接获取,当超越这个范围才会new出一个新Integer对象。
再看下面的例子:
Integer a = new Integer(100);
Integer b = 100;
int c = 100;
Integer d = 100;
System.out.println(a==b);
System.out.println(a==c);
System.out.println(b==c);
System.out.println(b==d);
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(c));
System.out.println(System.identityHashCode(d));
运行结果如下:
Integer与int数据类型进行比较的时候,会先将Integer转换程int型,在做值得比较,所以返回得是true。
Java中也有Integer类似得是Long,她也有一个缓存,在区间[-128,127]范围内获取缓存得值,而Long与long比较得时候先转换成long类型在做值得比较。
Double类型,他没有缓存,但是当Double与double比较的时候会先转换成double类型,再做值的比较。