一、基本数据类型与对象的差别
基本数据类型不是对象,也就是使用int、double、boolean等定义的变量、常量。
基本数据类型没有可调用的方法
int i = 1; //后面没有可以被调用的方法
Integer i = 1;//后面有很多方法可以被调用
Java是一个近乎纯洁的面向对象编程语言,但是为了编程的方便还是引入了基本数据类型,但是为了能够将这些基本数据类型当成对象操作,Java为每一个基本数据类型都引入了对应的包装类型(wrapper class),int的包装类就是Integer,从Java 5开始引入了自动装箱/拆箱机制,使得二者可以相互转换。
Java 为每个原始类型提供了包装类型:
- 原始类型: boolean,char,byte,short,int,long,float,double
- 包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double
二、什么是自动装箱拆箱
基本数据类型的自动装箱、拆箱是从J2SE 5.0开始提供的功能。
如:
//① 创建一个类的对象实例时
Class a = new Class(paramenter);
//② 创建一个Integer对象时,却可以
Integer i =100;//自动装箱 Integer i = Integer.valueOf(100);
//③
int t = i;//自动拆箱 int t = i.intValue();
//④
System.out.println(i++);//运算时,自动拆箱
//⑤
Integer a =new Integer(3);
Integer b =3; //将3自动装箱成Integer类型
int c =3;
System.out.println(a==b);//false 两个引用没有引用同一对象
System.out.println(a==c);//true a自动拆箱成int类型,再和c比较
实际上,当执行语句②时,系统为我们执行了: Integer i = Integer.valueOf(100);此也就是基本数据类型的自动装箱功能;
执行语句③时,实际执行了int t = i.intValue();自动拆箱功能;
语句④,运算时,也可以进行拆箱。
三、Integer的自动装箱:Integer.valueOf(int i);
Integer.java源码
public static Integer valueOf(int i){
if(i>=-128 && i<=IntegerCache.high)//-128~127 若没有设置,则IntegrCache.high默认为127
return IntegerCache.cache[i+128];//(一)此时,Integer.valueOf(int i)返回的是缓存的Integer对象
else
return new Integer(i);//(二)返回一个新建的Integer对象
}
例如:自动装箱功能
//① 在-128~127之外的数
Integer i1 =200;
Integer i2 =200;
System.out.println("i1==i2:"+(i1==i2));
//② 在-128~127之内的数
Integer i3 =100;
Integer i4 =100;
System.out.println("i3==i4:"+(i3==i4));
//③ 不使用自动装箱功能时
Integer i5 = new Integer(100);
Integer i6 = new Integer(100);
System.out.println("i5==i6:"+(i5==i6));
以上,输出结果
① i1==i2:false 源码中的情况(二),返回的是新建的Integer对象,所以i1与i2指向不同的对象
② i3==i4:true 源码中的情况(一),返回的是缓存Integer对象,所以i3与i4指向的是同一个对象
③ i5==i6:false 当不使用自动装箱功能时,情况与普通类对象一样
总结:
- 装箱过程是通过调用包装器的valueOf方法实现的
- 拆箱过程是通过调用包装器的xxxValue方法实现的(xxx表示对应的基本数据类型)
- Byte、Short、Integer、Long这几个类的valueOf方法实现类似的。所以在[-128,127]区间内,==比较的时候,值总是相等的(指向的是同一对象),在这个区间外是不等的。
- 而Float和Double则不相等, Boolean的值总是相等的
- equals():比较两个对象的值(内容)是否相同
”==“:比较两个对象的引用(内存地址)是否相同,也用来比较两个基础数据类型的变量值是否相等。
本文详细解析了Java中基本数据类型与对象的区别,包括自动装箱与拆箱的过程,以及Integer对象在不同数值范围内的缓存机制。强调了在-128到127之间的整数会复用对象,从而提高效率。
&spm=1001.2101.3001.5002&articleId=104770752&d=1&t=3&u=e003da8a54fe4f749b41c1bb65d092d3)
501

被折叠的 条评论
为什么被折叠?



