我们都知道Java是一种面向对象的语言,而八大基本数据类型不属于对象引用,而属于基本数据类型。所以Java推出了Integer等对应的包装类。
存储位置:
Integer对应的对象存储在堆上的对象中。
局部基本数据变量是直接存在虚拟机栈中的。
类非静态基本数据变量是直接存在对象实例中的。
类静态基本数据变量是直接存在class对象实例中的。
JVM中不存在基本数据类型的常量池的,我的猜测是如果要将变量存储在常量池中,还需要额外一次的访问内存。因为基本类型占据的空间比较小,所以直接存储在对象中或者虚拟机栈中,用着方便。
1、Integer的创建方式
1、Integer a = new Integer(1);
这时就是在堆中新建一个Integer对象,并且数据1直接存储在实例对象a上。
2、Integer a = Integer.valueOf(1);
这种也是生成一个Integer对象,只不过Java加入了缓存机制,默认会将取值范围[-128,127]之间的Integer对象缓存起来,当调用Integer.valueOf(xx)时,如果xx在[-128,127]之间,并且已经存在对应的对象的话,会直接返回对应的引用,如果不存在的话,才会新建对象,并将对象加入缓存中。
3、Integer a = 1;
默认调用的是Integer.valueOf(1),会将对象缓存起来。
Integer a = Integer.valueOf(1);
Integer b = Integer.valueOf(1);
System.out.println(a == b);//true
Integer a = new Integer(1);
Integer b = Integer.valueOf(1);
System.out.println(a == b);//false
//new Integer(1)不会将a对象缓存起来
Integer a = 1;
Integer b = Integer.valueOf(1);
System.out.println(a == b);//true
//Integer a = 1默认调用的Integer.valueOf(1)的,会将a对象缓存起来
2、int的创建方式
int a = 1;
局部基本数据变量是直接存在虚拟机栈中的。
类非静态基本数据变量是直接存在对象实例中的。
类静态基本数据变量是直接存在class对象实例中的。
3、Integer == int
当判断Integer 和 int是否相等的时候,是根据取值来判断的,而不是根据地址。
4、Integer == Integer
当判断Integer和Integer是否相等的时候,是根据地址来判断的,而不是根据取值。
5、自动装箱和拆箱
1、自动装箱:
Integer a = 1;//自动装箱,就是把int装箱为Integer,调用的方法其实是Integer a = Integer.valueOf(1)
Integer b = Integer.valueOf(1);
System.out.println(a == b)//true
2、自动拆箱:
Integer a = Integer.valueOf(1);
int c = a;//自动拆箱,其实调用的是int c = a.intValue();将Integer拆箱为int
System.out.println(a==c);当Integer和int比较的时候,会将Integer a进行拆箱,调用intValue(),然后进行比较.