标签:stat 通过 pre 存在 img object format 新建 src
官方文档的java.lang
包中可查看
基本数据类型所对应的引用数据类型
Object
可统一所有类,包装类的默认值为Null
对应关系
基本数据类型无方法可用,想使用方法需转换成包装类型,下图为官方文档中的Byte
类的部分方法
基本数据类型存储在栈空间中
引用类型数据存储在堆空间中
装箱、拆箱就是类型转换
装箱就是将基本类型转换成引用类型的过程(基本类型转换成包装类)
拆箱就是将引用类型转换成基本类型的过程(包装类转换成基本类)
八种包装类提供不同类型间的转换方式
Number
父类中提供六种共性方法
parseXXX()
静态方法,引用类型转换为基本类型
valueOf()
静态方法,基本类型转换为引用类型
注意:需保证类型兼容,否则抛出异常
String str = "12a";
int i3 = Integer.parseInt(str);
异常:Exception in thread "main" java.lang.NumberFormatException: For input string: "12a"
int
、Integer
的转换Integer
的相关方法
装箱
//装箱:转换成包装类
//基本数据类型
int num1 = 1;
//创建Integer类进行转换
//1.用构造方法
Integer integer1 = new Integer(num1);
//2.valueOf()方法
Integer integer2 = valueOf(num1);
拆箱
//拆箱:转换成包装类
//创建Integer实例
Integer integer3 = new Integer(2);
//intValue()方法
int num2 = integer3.intValue();
JDK1.5之后提供自动装箱和拆箱
//基本数据类型
int num1 = 1;
//自动装箱
Integer integer4 = num1;
//自动拆箱
int num4 = integer4;
基本类型转成String
//1.基本类型转换成String
int num = 10;
//1.1 加""
String s1 = num+"";
//1.2 静态方法valueOf()
String s2 = valueOf(num);
//1.3 Integer的toString()
Integer i1 = new Integer(num);
String s3 = i1.toString();
String转换成基本类型
//2.String转换成基本类型
String str = "12";
//2.1静态方法parseXXX()
int i2 = parseInt(str);
//2.2Integer的parseInt
int i3 = Integer.parseInt(str);
boolean的特殊情况
//3.注意boolean字符串形式转成基本类型,"true"-->true,非"true"-->false
String str1 = "true";
String str2 = "yes";
String str3 = "false";
//用Boolean的parseBoolean方法
boolean b1 = Boolean.parseBoolean(str1);
boolean b2 = Boolean.parseBoolean(str2);
boolean b3 = Boolean.parseBoolean(str3);
System.out.println(b1);//输出为true
System.out.println(b2);//输出为false
System.out.println(b3);//输出为false
Java预先创建了256个常用的证书包装类对象
在实际应用中对已创建的对象进行复用
代码
//面试题,判断值相同的两个Integer实例是否相等
//1.通过new Integer对象
Integer integer1 = new Integer(100);
Integer integer2 = new Integer(100);
System.out.println(integer1 == integer2);//输出为false
//2.自动装箱,值为100
Integer integer3 = 100;
Integer integer4 = 100;
System.out.println(integer3 == integer4);//输出为true
//3.自动装箱,值为200
Integer integer5 = 200;
Integer integer6 = 200;
System.out.println(integer5 == integer6);//输出为false
分析
将.class文件反编译(拖入XJad中),发现自动装箱使用的是valueOf()
方法
查看Integer
的valueOf()
源码
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
发现Integer
存在缓冲区(以数组的形式存在于堆中),大于low
、小于high
的数直接返回缓冲区中的值,否则才创建新对象
进一步查看源码
low=-128
,high=127
,即Integer
缓冲区包括大于-129,小于128的256个数,在这个范围内的数值相同时,引用地址也相同
题目解析
1.通过new Integer
创建了两个实例,实质是在堆空间中开辟了两个空间,在栈空间中的引用指向不同地址,所以两个对象不相等,返回false
2.通过自动装箱即valueOf()
方法,值为100,此时因为100处于整数缓冲区内,直接返回缓冲区中的地址,integer3
与integer4
的引用地址相同,所用相等
3.通过自动装箱即valueOf()
方法,值为200,此时因为200不在整数缓冲区内,所以要新建两个对象,在堆中开辟两个空间,所以引用地址不同,两个值不相等
https://www.cnblogs.com/fsg6/p/12752222.html
标签:stat 通过 pre 存在 img object format 新建 src
原文地址:https://www.cnblogs.com/c1ao/p/13648365.html