基本数据类型
-
定义
Java语言是强类型语言,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间。 -
基本数据类型的分类
包装类
包装类顾名思义就是将基本数据类型的所没有属性和方法包装到类中,实现对象化的交互。
区别
基本数据类型和包装类的区别主要有以下4点: -
包装类可以为
null
,而基本类型不可以
这使得在POJO中只能应用包装类型,而基本类型则不行。
POJO:简单无规则的Java对象,只有属性字段以及setter和getter方法。
示例:
class Writer{
private Integer age;
public Integer getAge(){
return age;
}
public void setAge(Integer age){
this.age=age;
}
}
只能使用包装类型的原因是:数据库的查询结果可能是null,如果使用基本类型的话,因为要自动拆箱(将包装类型转为基本类型),就会抛出NullPointerException
的异常。
- 包装类型可以用于泛型,而基本类型不可以
ArrayList<int> list = new ArrayList<>();
// 提示 Syntax error, insert "Dimensions" to complete ReferenceType
ArrayList<Integer> list = new ArrayList<>();
- 基本类型比泛型更高效
基本数据类型的具体数值直接存储在栈中,而包装类型在栈中存储的只是堆中的引用。如下图所示:
从图中可以看出,相比于基本数据类型,包装类型要占用更多的内存空间。且两个包装类型的值相同,并不代表它们相等。
Integer a = new Integer(10);
Integer b = new Integer(10);
System.out.println(a==b); //false
System.out.println(a.equals(b)); //true
- 自动装箱和自动拆箱
把基本类型转换成包装类型的过程叫做装箱。
反之,把包装类型转换成基本类型的过程叫做拆箱。
在Java SE5之前,开发人员需要手动进行拆装过程:
Integer a = new Integer(10); //手动装箱
int b = a.intValue(); //手动拆箱
Java SE5 开始提供了自动装箱与自动拆箱的功能:
Integer a = 10; //自动装箱
int b = a; //自动拆箱
等价于
=>
Integer a = Integer.valueOf(10);
int b = a.intValue();
即,自动装箱通过Integer.valueOf()
来完成,而自动拆箱通过Integer.intValue()
来完成。
需要注意的是:当需要进行自动装箱时,如果数字在 -128 至 127 之间时,会直接使用缓存中的对象,而不是重新创建一个对象。
示例:
//1.基本类型与包装类型
int a = 100;
Integer b = 100;
System.out.println(a==b); //true
//2.两个包装类型
Integer c = 100;
Integer d = 100;
System.out.println(c==d); //true
//3.
Integer c = 128;
Integer d = 128;
System.out.println(c==d); //false