1.Java 中有 8 个基本类型,分别对应的包装类如下
byte – Byte
boolean – Boolean
short – Short
char – Character
int – Integer
long – Long
float – Float
double – Double
2.为什么要有包装类
(1)基本数据类型方便、简单、高效,但泛型不支持、集合元素不支持
不符合面向对象思维
(2)包装类提供很多方法,方便使用,如 Integer 类 toHexString(int i)、parseInt(String s) 方法等等
3.基本数据类型和包装类之间的转换
(1)包装类–>基本数据类型:包装类对象.xxxValue()
(2)基本数据类型–>包装类:new 包装类(基本类型值)
JDK1.5 开始提供了自动装箱(autoboxing)和自动拆箱(autounboxing)功能, 实现了包装类和基本数据类型之间的自动转换
包装类可以实现基本类型和字符串之间的转换,字符串转基本类型:parseXXX(String s);基本类型转字符串:String.valueOf(基本类型)
4.基本类型和包装类的区别?
(1)基本类型只有值,而包装类型则具有与它们的值不同的同一性(即值相同但不是同一个对象)
(2)包装类型比基本类型多了一个非功能值:null
(3)基本类型通常比包装类型更节省时间和空间,速度更快
但有些情况包装类型的使用会更合理:
(1)泛型不支持基本类型,作为集合中的元素、键和值直接使用包装类(否则会发生基本类型的自动装箱消耗性能)。如:只能写 ArrayList,不能写 List
(2)在进行反射方法的调用时
5.基本类型和包装类对象使用 == 和 equals进行比较的结果?
1、值不同,使用 == 和 equals() 比较都返回 false
2、值相同
使用 == 比较:
基本类型 - 基本类型、基本类型 - 包装对象返回 true
包装对象 - 包装对象返回 false
缓存中取的包装对象比较返回 true(原因是 JVM 缓存部分基本类型常用的包装类对象,如 Integer -128 ~ 127 是被缓存的)
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2); //打印true
System.out.println(i3==i4); //打印false
使用 equals() 比较
包装对象-基本类型返回 true
包装对象-包装对象返回 true
3、不同类型的对象对比,返回 false
6.什么是装箱?什么是拆箱?
装箱:基本类型转变为包装器类型的过程。
拆箱:包装器类型转变为基本类型的过程。
//JDK1.5之前是不支持自动装箱和自动拆箱的,定义Integer对象,必须
Integer i = new Integer(8);
//JDK1.5开始,提供了自动装箱的功能,定义Integer对象可以这样
Integer i = 8;
int n = i;//自动拆箱
7.装箱和拆箱的执行过程?
装箱是通过调用包装器类的 valueOf 方法实现的
拆箱是通过调用包装器类的 xxxValue 方法实现的,xxx代表对应的基本数据类型。
如int装箱的时候自动调用Integer的valueOf(int)方法;
Integer拆箱的时候自动调用Integer的intValue方法。
8.常见问题?
整型的包装类 valueOf 方法返回对象时,在常用的取值范围内,会返回缓存对象。
浮点型的包装类 valueOf 方法返回新的对象。
布尔型的包装类 valueOf 方法 Boolean类的静态常量 TRUE | FALSE。
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2);//true
System.out.println(i3 == i4);//false
Double d1 = 100.0;
Double d2 = 100.0;
Double d3 = 200.0;
Double d4 = 200.0;
System.out.println(d1 == d2);//false
System.out.println(d3 == d4);//false
Boolean b1 = false;
Boolean b2 = false;
Boolean b3 = true;
Boolean b4 = true;
System.out.println(b1 == b2);//true
System.out.println(b3 == b4);//true
包含算术运算会触发自动拆箱。
存在大量自动装箱的过程,如果装箱返回的包装对象不是从缓存中获取,会创建很多新的对象,比较消耗内存。
本人才疏学浅,如有错误,烦请指出,谢谢!