欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Integer a= 127 与 Integer b = 128相关

程序员文章站 2022-04-14 16:45:10
Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; a == b 与 c == d 的比较结果是什么? a == b 的结果为true 而 c == d的结果为false; 为什么会出现结果?百度之后发现问题的根源所 ......

integer a = 127;

integer b = 127;

integer c = 128;

integer d = 128;

a == b 与 c == d 的比较结果是什么?

a == b 的结果为true 而 c == d的结果为false;

为什么会出现结果?百度之后发现问题的根源所在,在解决这个问题之前,先说说常量池的概念,百度百科上有

我再复述一遍。

java常量池

常量池在java中用于保存编译期已经确定的,它包括了关于类,方法,接口中的常量,也包括字符串常量。例如
string s = "java" 这种声明的方式。产生的这种"常量"就会被放到常量池,常量池是jvm的一块特殊的内存空间。
使用java常量池技术,是为了方便快捷地创建某些对象,当你需要一个对象时候,就去这个池子里面找,找不到就在池子里面创建一个。但是必须注意 如果对象是用new 创建的。那么不管是什么对像,它是不会放到池子里的,而是向堆申请新的空间存储。
java中基本类型的包装类的大部分都实现了常量池技术,这些类是byte,short,integer,long,character,boolean,另外两种浮点数类型的包装类则没有实现。另外byte,short,integer,long,character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池。超过了就要申请空间创建对象了
”==“ 我们知道比较的是引用的地址(其实java不要允许用户直接对内存进行操作的的)。

当我们使用integer a = 127 的时候 实际上调用的是下面这个方法:

1  public static integer valueof(int i) {
2         assert integercache.high >= 127;
3         if (i >= integercache.low && i <= integercache.high)
4             return integercache.cache[i + (-integercache.low)];
5         return new integer(i);
6     }
这个方法的首先断言了integercache.high的值大于等于127(关于这里assert 大于等于127解释请看补充),否则退出方法。
接着if条件内i需要在low值和high值之间。
 Integer a= 127 与 Integer b = 128相关

 

 

可以看到low为-128,即if条件需要i在-128和127之间,那么返回i+128作为整型数组 cache的下标,用来放在缓存中。这样也就是说任意一个相同数值的integer的数,如果在-128和127之间,那么它们之间的内存地址是相同的。
这也就解释了为什么integer a=127,b=127时候a==b返回true。
而如果if条件不满足则返回new integer(i)。

即如果 数在 -128到127之间 就返回池子中的对象。没有的话就创建
--------------

其实如果问题是这样的话
integer a = new integer(127);

integer b = new integer(127);

integer c = 128;

integer d = 128;

a == b 一定为false 因为 没有去找常量池,a,b都是在堆中申请了空间 返回的引用肯定不一样。