java基本数据类型对象包装类
java基本数据类型对象包装类
⼀、包装类说明
为了⽅便操作基本数据类型值,将其封装成了对象,在对象中定义了属性和⾏为丰富了该数据的操作。⽤于描述该对象的类就称为基本数据类型对象包装类。
基本数据类型与相应的包装类
byte Byte
short Short
int Integer
long Long
float Float
double Double
char Character
boolean Boolean
⼆、包装类主要功能
该包装对象主要⽤基本类型和字符串之间的转换。
(1)基本类型--->字符串
1、基本类型数值+""
2、⽤String类中的静态⽅法valueOf(基本类型数值);
3、⽤包装类的静态⽅法valueOf(基本类型数值);
(2)字符串--->基本类型
1、使⽤包装类中的静态⽅法:xxx parseXxx("xxx类型的字符串");
eg:
int parseInt("intstring");
long parseLong("longstring");
boolean parseBoolean("booleanstring");
备注:只有Character没有parse⽅法,本⾝就是封装了字符,⽆须转换
2、如果字符串被xxx包装类进⾏对象的封装。
可使⽤另⼀个⾮静态的⽅法,xxxValue();
将⼀个xxx包装类对象转成基本数据类型值。
三、JDK1.5⾃动装箱拆箱
(1)拆箱装箱概念
装箱:⾃动将基本数据类型转换为包装器类型;
拆箱:⾃动将包装器类型转换为基本数据类型。
(2)jdk1.5后包装类新特性
Integeri=4;//⾃动装箱,简化书写:Integer i=new Integer(4);
i=i+6;//i=new Integer(i.intValue+6);//⾃动拆箱
System.out.println(i.intValue());//10
(3)拆箱装箱实现
装箱:⾃动将基本数据类型转换为包装器类型;装箱过程是通过调⽤包装器的valueOf⽅法实现的
拆箱:⾃动将包装器类型转换为基本数据类型。拆箱过程是通过调⽤包装器的 xxxValue⽅法实现的。(xxx代表对应的基本数据类型)。【1】实现代码案例
package wrapper;
public class Autoboxing_Unboxing {
public static void main(String[] args) {
Integer i = 10;//装箱
java valueofint n = i;//拆箱
}
}
【2】反编译代码发现
反编译class⽂件之后得到如下内容:
从反编译得到的字节码内容可以看出,在装箱的时候⾃动调⽤的是Integer的valueOf(int)⽅法。⽽在拆箱的时候⾃动调⽤的是Integer的intValue⽅法。
其他的也类似,⽐如Double、Character,不相信的朋友可以⾃⼰⼿动尝试⼀下。
【3】结论
因此可以⽤⼀句话总结装箱和拆箱的实现过程:
装箱过程是通过调⽤包装器的valueOf⽅法实现的,
拆箱过程是通过调⽤包装器的 xxxValue⽅法实现的。(xxx代表对应的基本数据类型)。
四、包装类装箱之valueOf⽅法之思
1、创建对象与valueOf⽅法【装箱】
思考:由于装箱过程是调⽤包装器的valueOf⽅法实现的,
即:当Integer i=3过程,创建Integer对象的时候,这样⼀个装箱过程,就会调⽤包装器的valueOf⽅法。所以,我们在此重点讨论这个valueOf⽅法。
2、valueOf⽅法结论
主要得出⼏个结论:
2.1不同包装类之间,有共性的地⽅。分为三⼤派别:
【1】Integer、Short、Byte、Character、Long这⼏个类的valueOf⽅法的实现是类似的。⽐较特殊,根据数值的⼤⼩范围⽽获得对象的⽅式不同
【2】Double、Float的valueOf⽅法的实现是类似的,每次都返回不同的对象。
【3】Boolean的valueOf⽅法实现,每次返回的都是同⼀个对象
2.2对于类别【1】
(1)有两种创建对象的情况:
《1》在⼀些特定取值范围内,创建的对象是共享的,即:该数值范围的对象,在内存中只创建⼀个(⼀次),以后想创建该数值的对象,直接获取即可,不需要去new新的。
这个范围的取值情况是:
相同对象范围:在该范围内,同数值情况下,对象是相同的,是同⼀个。
Integer 相同对象范围 [-128,127]
Short 相同对象范围 [-128,127]
Byte 相同对象范围 [-128,127]
Character 相同对象范围 [0,127]
Long 相同对象范围 [-128,127]
《2》除了上述的取值范围内,对象只创建⼀个,这⾥所说的范围内,对象不会共享,相同数值情况下,会创建不同的对象
这个范围的取值情况是:
不同对象范围:在该范围内,同数值情况下,对象是不同的,是多个不同的。
Integer 不同对象范围 i<128||i>=128
Short 不同对象范围 s<128||s>=128
Byte 不同对象范围 ⽆
Character 不同对象范围 c>=128
Long 不同对象范围 L<128||L>=128
综合《1》《2》得
Integer 相同对象范围 [-128,127] 不同对象范围i<128||i>=128
Short 相同对象范围 [-128,127] 不同对象范围s<128||s>=128
Byte 相同对象范围 [-128,127] 不同对象范围⽆
Character 相同对象范围 [0,127] 不同对象范围c>=128
Long 相同对象范围 [-128,127] 不同对象范围 L<128||L>=128
(2)Integer的valueOf源码
来源:CSDN博客
博⽂:Java ⾃动装箱和拆箱
博主:jackiehff
【1】valueOf⼯⼚⽅法
public static Integer valueOf(int i) {
if(i >= -128 &&i<=IntegerCache.high)
//如果i在-128~high之间,就直接在缓存中取出i的Integer类型对象
return IntegerCache.cache[i + 128];
else
return new Integer(i); //否则就在堆内存中创建
}
【2】IntegerCache内部类
private static class IntegerCache {//内部类,注意它的属性都是定义为static final static final inthigh; //缓存上界
static final Integer cache[];//cache缓存是⼀个存放Integer类型的数组
static {//静态语句块
final int low = -128;//缓存下界,值不可变
// high valuemay beconfigured by property
int h = 127;// h值,可以通过设置jdk的AutoBoxCacheMax参数调整(参见(3)) if (integerCacheHighPropValue!=null) {
// UseLong.decode here to avoid invoking methods that
// requireInteger's autoboxing cache to be initialized
// 通过解码integerCacheHighPropValue,⽽得到⼀个候选的上界值
int i = Long.decode(integerCacheHighPropValue).intValue();
// 取较⼤的作为上界,但⼜不能⼤于Integer的边界MAX_VALUE
i = Math.max(i, 127);//上界最⼩为127
// Maximumarray size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - -low);
}
high = h; //上界确定,此时high默认⼀般是127
// 创建缓存块,注意缓存数组⼤⼩
cache =new Integer[(high - low) +1];
int j = low;
for(int k = 0; k <cache.length; k++)
cache[k] =new Integer(j++);// -128到high值逐⼀分配到缓存数组
}
private IntegerCache() {}//构造⽅法,不需要构造什么
}
分析:取值范围[-128,127]共享对象,之外创建独⽴对象
(3)Short的valueOf源码
public static Short valueOf(short s) {
final int offset = 128;
int sAsInt = s;
if (sAsInt >= -128 &&sAsInt <= 127) { // must cache
return ShortCache.cache[sAsInt +offset];
}
return new Short(s);
}
分析:取值范围[-128,127]共享对象,之外创建独⽴对象
(4)Long的valueOf源码
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论