①基本数据类型(8种)
-
数值型
-
整数型 byte、short、int 、long
byte占一个字节8个bits,默认值为0;short占两个字节16bits,默认值也为0;
int占用4个字节32bits,默认值为0;long占8个字节64bits,默认值是0L
-
浮点数 float、double
float单精度 4个字节32bits,默认值是0.0f
double 双精度 8个字节64bits 默认值是0.0d
-
-
字符型 char
16bits
-
布尔型 boolean
只有false或者true,默认值为false
不明确指定整数型默认为int,带小数默认为double
②基本数据类型对应的包装类
为什么会出现?
Java的思想就是一切皆是对象,而基本数据类型不是一个对象,所以Java通过包装类实现对基本基本数据类型的引用。
有些地方只能用对象比如l集合中不能使用基本数据类型,这里就可以使用包装类
包装类分类:
Integer和int、Boolean和boolean、Byte与byte、Character与char、Double与double、Number抽象类
(注意:这里String不是包装类,string也不是基本数据类型)
包装类比较:
包装类(以Integer为例) | 基本数据类型(以int为例) |
---|---|
一个对象 | 只是一个数据类型 |
必须实例化才能使用 | 直接定义就行 |
表示一个Integer对象的引用 | |
默认值为null | 默认值为0 |
Integer中存在很多操作方法(Integer.toString()) | 只能进行简单的加减乘除操作 |
Auto-Boxing/UnBoxing
自动装箱和自动拆箱
-
装箱:基本数据类型封装成包装类(int------>Integer)
Interger i=10; --------会自动装箱-----> Interger i=Interger.valueOf(10)
-
拆箱:包装类变成基本数据类型(Integer----->int)
当Integer与int需要比较的时候,Integer就会自动拆箱成int进行基本数据类型的比较
包装类和基本数据类型之间的==
==比较的是对象地址是否相同,equals是比较引用对象的内容是否相同
public class TestInteger {
public static void main(String[] args) {
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i == i2); //Integer会自动拆箱为int,所以为true
System.out.println(i == i3); //true,理由同上
Integer i4 = 127;//编译时被翻译成:Integer i4 = Integer.valueOf(127);
Integer i5 = 127;
System.out.println(i4 == i5);//true
Integer i6 = 128;
Integer i7 = 128;
System.out.println(i6 == i7);//false
Integer i8 = new Integer(127);
System.out.println(i5 == i8); //false
Integer i9 = new Integer(128);
Integer i10 = new Integer(123);
System.out.println(i9 == i10); //false
}
}
-
new的Integer对象
Integer i9 = new Integer(123);
Integer i10 = new Integer(123);
System.out.println(i9 == i10); //false
通过new出来的对象地址永远都不是一个,所以这里输出为false
Integer i5 = 127;
Integer i8 = new Integer(127);
System.out.println(i5 == i8); //false
-
Integer与int比较
int i = 128;
Integer i2 = 128;
Integer i3 = new Integer(128);
System.out.println(i == i2); //Integer会自动拆箱为int,所以为true
System.out.println(i == i3); //true,理由同上
Integer与int的比较就是比较值是否相等,Integer会自动拆箱成int
-
Integer之间的比较
Integer i4 = 127;//编译时被翻译成:Integer i4 = Integer.valueOf(127);
Integer i5 = 127;
System.out.println(i4 == i5);//true
Integer i6 = 128;
Integer i7 = 128;
System.out.println(i6 == i7);//false
非new出来的Integer对象,在-128----127之间,值相等就是true
不在这个区间内会创建两个对象,所以为false
这里为什么会创建两个对象主要是因为valueOf()函数,Integer i4 = Integer.valueOf(127),而valueOf()函数会对-128到127之间的数进行缓存,当i5为127时,不会创建一个新的对象而是直接从缓存中取