浅谈byte型常量池

浅谈byte型常量池

二话不说,先来看三个代码

Integer i1 = 127 ;
Integer i2 = 127 ;

println(i1 = i2);
true
Integer i1 = 128 ;
Integer i2 = 128 ;

println(i1 = i2);
false
Integer i1 = -1;
Integer i2 = -1 ;

println(i1 = i2);
true

那么问题来了
为什么最终结果会是这样呢?

相信大部分人会回答
因为在Java底层中会将常用的值放入常量池中,方便取出,而这个值就是byte型数值的范围

这里有个高大上的词 常量池

那么第二问题来了
如果查看这个常量池呢 ? 我们有什么依据可以看到这个常量池呢 ?

让我们先对上述代码进行字节码
浅谈byte型常量池_第1张图片
我们会发现integer在字节码汇中的实现就是用integer.valueof

那么让我们带着这个原理看看Java底层是如何实现的

public static Integer valueOf(int var0){
    return var0 >= -128 && var0 <= Inteer.IntegerCache.high ? Integer.IntegerCache.cache[var0 + 128] : new Integer(var0);
}

底层中已经告诉我们,只要范围在byte范围中,就会去缓存中获取数据.

所以其实在byte范围值并不是在常量池中,而是事先放入了缓存中,方便拿取

你可能感兴趣的:(Java)