什么是包装类?
由于Java是强类型的语言
强类型的语言本质其实来自于数据在内存当中的存储。
将基本数据类型变为对象,java包装类出现了
Java包装类是将基本数据类型的值变为对象的方式,每个基本类型在java.lang包中都有一个相应的包装类
基本类型与包装类
-
基本类型:
boolean
,char
,byte
,short
,int
,long
,float
,double
-
包装类:
Boolean
,Character
,Byte
,Short
,Integer
,Long
,Float
,Double
valueof()将数值在-128-127之间的数值都存储在有一个catch数组当中,该数组相当于一个缓存,当我们在-128-127之间进行自动装箱的时候,我们就直接返回该值在数组当中的地址,所以在-128-127之间的数值用==进行比较是相等的。
程序在执行Integer b=a;
的时候调用了Integer.valueOf ( int i ) 方法,`Integer b=a; 这段代码等同于:Integer b=Integer.valueOf ( a )
而不在这个区间的数,需要新开辟一个内存空间,地址是不相同的
实例
public class Test_1 {
//128陷阱
public static void main(String[] args){
Integer a1 =10;
Integer a2 =10;
System.out.println(a1 == a2); //ture
//==比较的是地址想否相等
Integer a3 = 1000;
Integer a4 =1000;
//Integer.value0f()
System.out.println(a3 == a4);//false
}
输出结果:true false
10在-128-127区间内,地址都相同
1000超出范围,开辟了新的一块内存空间,地址是不相同的
实例2
public class Test {
public static void main(String[ ] args) {
//Integer b = 10;//------->Integer b = Integer . valueOf(10);自动装箱
//int a = b; //int a = b.intValue();自动拆箱
int a = 10;
int b = 10;
Integer a1 = 10;
Integer b1 = 10;
Integer a2 = new Integer(10) ;
Integer b2 = new Integer( 10);
System.out.println(a == b);
System.out.println(a1 ==b1);//从数组当中找数据,==比较地址所以为true
System.out.println(a2==b2); //new开辟了新的内存空间
System.out.println(a1 == a);//true 因为包装类和基本数据类型用==比较的时候会自动拆箱
System.out . println(a1.equals(a));//true 因为包装类和基本数据类型用equals()比较的时候会自动拆箱
System.out.println(a1 == a2);
System.out.println(a == a2);//自动拆箱
}
}
输出结果TTFTTFT
自动装箱拆箱问题
Integer b = 10;
//会被编译成 Integer b = Integer.valueOf(10); //自动装箱
int a = b;
//会被编译成 int a = b.intValue(); //自动拆箱
A装箱就是自动将基本数据类型转换为包装器类型;
B拆箱就是 自动将包装器类型转换为基本数据类型
包装类和基本数据类型比较的时候会自动拆箱
(==和equals都是会自动拆箱)
拆箱过后就是基本数据类型。比较数据的值是否相同
通过” == “ 来比较对比的是栈中的值,基本数据类型比较的值,引用数据类型比较的是堆中内存对象的地址。即判断两个对象是否相等,实际上是在判断两个局部变量存储的地址是否相同,即是否指向相同的对象。
为什么IntegerCache只缓存 -128~127之间的整型值?
当IntegerCache类被加载的时候,缓存的享元对象会被集中一次性创建好,而整型数值太多,不能一次性被创建,否则会占用太多的内存,类加载的时间会过长,即只能缓存大部分应用来说最常用的整型值,即一个字节的大小,byte数据类型的范围。
实际,jdk提供了自定义缓存的最大值