Integer底层原理探究

目录

1. int和Integer的区别

2. 前提知识:

3. 实验比较:


1. int和Integer的区别

● int是基本数据类型,代表整型数据,默认值是0;
● Integer是 int的包装类,属于引用类型,默认值为null;
● int 和 Integer 都可以表示某一个整型数值;
● Integer变量实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值;
● Integer可以区分出未赋值和值为 0 的区别,而int 则无法表达出未赋值的情况;
● int 和 Integer 不能够互用,因为他们是两种不同的数据类型;
● int在初始化时,可以直接写成 int=1 的形式;
● 因为Integer是包装类型,使用时可以采用 Integer i = new Integer(1) 的形式,但因为Java中的自动装箱和拆箱机制,使得对Integer类的赋值也可以使用 Integer i= 1 的形式;
● 如果我们只是进行一些加减乘除的运算 或者 作为参数进行传递,那么就可以直接使用int这样的基本数据类型;但如果想按照对象来进行操作处理,那么就要使用Integer来声明一个对象。


2. 前提知识:

1,装箱存在的情况: int 赋值给Integer 即基本类型赋值给包装类型时

Integer i = 1; 等价于 Integer i = Integer.valueOf(1); java自动完成装箱操作,

2,拆箱存在的情况: int与Integer比较 及基本类型和包装类型比较时

Integer i = new Integer(1);

int j = 1;

i == j //等价于 i.intValue() == j i对象会自动拆箱int类型和j进行比较

3,IntegerCache是个Integer的内部类,在类加载的时候创建了256个缓存Integer对象,范围-128至127,当生成的对象是这个范围内时默认使用缓存,除非是new 出来的;

 private static class IntegerCache {
 static final int low = -128;
 static final int high;
 static final Integer cache[];

 static {

 int h = 127;
 String integerCacheHighPropValue =
 sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
 if (integerCacheHighPropValue != null) {
 try {
 int i = parseInt(integerCacheHighPropValue);
 i = Math.max(i, 127);

 h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
 } catch( NumberFormatException nfe) {

 }
 }
 high = h;

 cache = new Integer[(high - low) + 1];
 int j = low;
 for(int k = 0; k < cache.length; k++)
 cache[k] = new Integer(j++);


 assert IntegerCache.high >= 127;
 }

 private IntegerCache() {}
 }


3. 实验比较:
 

1,

Integer a=100;
Integer b=100;
System.out.println(a==b);//true(使用了缓存)

2,

Integer a1=new Integer(100);
Integer b1=new Integer(100);
System.out.println(a1==b1);//false(都是new出来的两个堆内对象)

3,

Integer a2=100;
Integer b2=new Integer(100);
System.out.println(a2==b2);//false(一个缓存一个new)

4,

Integer a3=1000;
Integer b3=1000;
System.out.println(a3==b3);//false(超出缓存范围都是new)

5,

Integer a4=1000;
int b4=1000;
System.out.println(a4==b4);//true(都转化为int比较)

参考:

1. 揭秘Integer实现原理及缓存机制_integer缓存机制_头顶假发的博客-CSDN博客

2.从零开始学Java—Integer底层原理探究 - 知乎