首页 > 代码库 > Java Integer 常量池
Java Integer 常量池
Integer类
Integer 类在对象中包装了一个基本类型 int 的值。Integer 类型的对象包含一个 int 类型的字段。
此外,该类提供了多个方法,能在 int 类型和 String 类型之间互相转换,还提供了处理 int 类型时非常有用的其他一些常量和方法。
Integer i = 10 和 Integer j = new Integer(10) 的区别
View Code
1 1.publicstaticvoid main(String[] args){2 2.Integer i=10;3 3.Integer j=newInteger(10);4 4.System.out.println(i==j);5 5.}
编译上面的代码,我们利用反编译工具查看:
1 public class Test {2 public static void main(String[] args) {3 Integer i = Integer.valueOf(10);4 Integer j = new Integer(10);5 System.out.println(i == j);//false6 }7 }
由此可见,当我们使用Integer i=10;创建一个Integer时,实际上底层调用的是Integer.valueOf(10);
Integer.valueOf()
关于这个方法,JDK中是这样说的:
public static Integer valueOf(int i)
|
这个方法总是缓存了-128到127之间的值,还有,它也可以缓存这个范围之外的值。
为了说明这个问题,让我们来看看Integer.valueOf()的源代码:View Code1 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实际上是Integer 一个静态内部类:
View Code1 private static class IntegerCache { 2 static final int low = -128; 3 static final int high; 4 static final Integer cache[]; 5 static { 6 // high value may be configured by property 7 int h = 127; 8 String integerCacheHighPropValue =http://www.mamicode.com/ 9 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");10 if (integerCacheHighPropValue != null) {11 int i = parseInt(integerCacheHighPropValue);12 i = Math.max(i, 127);13 // Maximum array size is Integer.MAX_VALUE14 h = Math.min(i, Integer.MAX_VALUE - (-low) -1);15 }16 high = h;17 cache = new Integer[(high - low) + 1];18 int j = low;19 for(int k = 0; k < cache.length; k++)20 cache[k] = new Integer(j++);21 }22 private IntegerCache() {}23 }
通过上面的代码,我们可以很清楚的看到,当我们在-128到127这个范围内调用valueof()这个函数时,实际上使用的是缓存(IntegerCache)里面的值。
IntegerCache是帮助我们缓存Integer的类。缓存数值的大小是由-XX:AutoBoxCacheMax= <size>来控制,或者可以通过系统属性来获得:-Djava.lang.Integer.IntegerCache.high=<size>
所以如果值在-128到127之间,你使用valueof()将获得相同的引用,超过这个范围将返回new Integer(int)。因为是相同的引用,在-128到127范围内你的==操作是有用的。换句话来说,当我们通过以下方式创建Integer类:View Code1 Integer int1=10;2 Integer int2=Integer.valueOf(10);会获得在缓存池上相同的实例。
Java缓存了-128到127范围内的Integer类。所以当你给这个范围的封装类赋值时,装箱操作会调用Integer.valueOf() 函数,反过来就会给封装类赋上一个缓存池实例的引用。另一方面来说,如果用超出这个范围的值给封装类赋值时,Integer.valueOf()会创建一个新的Integer类。因此,比对超出这个范围的Integer类时,会返回false。同理,Short、Byte、Long也缓存-128到127之间的数值。
来自为知笔记(Wiz)
Java Integer 常量池
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。