目录
基本数据类型
八大数据类型
Java类型分类
基本类型:
引用类型:
void类型
使用基本数据类型的好处
包装类型
创建对象方法
Byte
Boolean
Short
Character
Integer
Long
Float
Double
为什么需要包装类
装箱与拆箱
装箱与拆箱
装箱:
拆箱:
自动拆装箱
自动装箱:
自动拆箱:
自动拆装箱的实现原理
自动拆装箱使用场景
1.将基本类型放入集合类
2.包装类型和基本类型比较大小
3.包装类型的运算
4.三目运算符的使用
5.函数参数与返回值
自动拆装箱与缓存
自动拆装箱带来的问题
基本数据类型
字符型 char
布尔类型 boolean
整数类型 byte、short、int、long
浮点数类型 float、double
在JVM栈中分配空间存值
在堆中分配空间存值
Java还存在一种基本类型void,对应的包装类为java.lang.Void,Void是不能被new出来的
因此不能在堆中分配存储空间存储对应的值
在Jva语言中,new一个对象是存储在堆中的,我们通过栈中的引用来使用这些对象,是比较费资源的
而常用的基本数据类型,不需要用new创建,数据直接存放在栈中,所以会更加高效
我们可以知道,在栈中每一个栈帧,都包含了局部变量表,这里局部变量中的数据,就是存储在局部变量表中的
包装类型
基本数据类型 | 包装类 |
---|---|
byte | Byte |
boolean | Boolean |
short | Short |
char | Character |
int | Integer |
long | Long |
float | Float |
double | Double |
public class Test04 {
public static void main(String[] args) {
Byte a = 2; //通过自动装箱赋值
Byte b = new Byte(String.valueOf(1)); //通过String创建对象
}
}
public class Test04 {
public static void main(String[] args) {
Boolean a = true; //通过valueOf赋值
Boolean c = new Boolean(String.valueOf(true)); //通过String
Boolean b = new Boolean(true); //通过常数
}
}
public class Test04 {
public static void main(String[] args) {
Short a = 1; //通过自动装箱赋值
Short b = new Short(String.valueOf(1)); //通过String创建对象
}
}
public class Test04 {
public static void main(String[] args) {
Character a = '1'; //通过valueOf赋值
Character b = new Character('1'); //通过常数
}
}
public class Test04 {
public static void main(String[] args) {
Integer a = 2; //通过自动装箱赋值
Integer b = new Integer(1); //通过常数
Integer c = new Integer(String.valueOf(1)); //通过String创建对象
}
}
public class Test04 {
public static void main(String[] args) {
Long a = Long.valueOf(2); //通过valueOf赋值
Long b = new Long(1); //通过常数
Long c = new Long(String.valueOf(1)); //通过String创建对象
}
}
public class Test04 {
public static void main(String[] args) {
Float a = Float.valueOf((float) 2.1); //通过valueOf赋值
Float b = new Float(1.5); //通过常数
Float c = new Float(String.valueOf(1)); //通过String创建对象
}
}
public class Test04 {
public static void main(String[] args) {
Double a = Double.valueOf((Double) 2.1); //通过valueOf赋值
Double b = new Double(1.5); //通过常数
Double c = new Double(String.valueOf(1)); //通过String创建对象
}
}
Java是面向对象的语言,很多地方都是需要使用对象而不是剧本数据类型的
比如在集合类中,我们无法将int等数据类型放进去,因为集合的容器要求元素是Object类型
为了让基本类型也具有对象特性,就出现了包装类型,丰富了基本类型的操作
装箱与拆箱
把基本类型转换为包装类的过程就是装箱
把包装类转换为基本数据类型就是拆箱
在JavaSE5中,为了减少开发人员的工作,Java提供了自动拆装箱功能
将基本数据类型自动转化为对应的包装类
将包装类自动转化成对应的基本数据类型
自动装箱都是通过包装类的valueOf方法实现的
自动装箱都是通过包装类对象xxxValue方法实现的(如intValue)
集合类中都是对象类型,但是我们add(基本数据类型)也不会报错,是因为Java给我们做了自动装箱
包装类与基本数据类型进行比较运算,先将包装类进行拆箱成基本数据类型,然后比较
对两个包装类型进行运算,会将包装类型自动拆箱为基本类型进行
如
falg?i:j
//自动拆箱
public int getNum1(Integer num) {
return num;
}
//自动装箱
public Integer getNum2(int num) {
return num;
}
在Java SE5中,Integer操作引入了新功能来节省内存和提高性能
1.适用于整数区间-128~+127
2.只适用于自动装箱,使用构造函数创建对象不适用
3.只适用于整形,浮点型不行
public class Test04 {
public static void main(String[] args) {
//不创建对象且在-128~127中
Integer a = 1;
Integer b = 1;
System.out.println(a == b); //true
//创建对象且在-128~127中
Integer c = new Integer(1);
Integer d = new Integer(1);
System.out.println(c == d); //fasle
//不创建对象且不在-128~127中
Integer e = 200;
Integer f = 200;
System.out.println(e == f); //false
}
}
1.包装对象之间的数值比较不能简单的使用==,除了特殊情况(如Integer的-128~127),其他比较都需要使用equals比较
2.如果包装类对象为NULL,那么自动拆箱就可能会抛出NPE
3.如果一个for循环中有大量拆装箱操作,会浪费很多资源
参考文章
什么是Java中的自动拆装箱_HelloWorld搬运工-CSDN博客_java自动拆装箱
Java 中基本数据类型是 8 种还是 9 种? Void 的解释._话流年的博客-CSDN博客_void是不是基本数据类型