1、基本数据类型
Java中有4类、共8种基本类型的数据:
分类 | 类型 | 字节数 | 默认值 | 范围 |
整数型 | byte | 1 | 0 | -128~127 |
short | 2 | 0 | -2^15~2^15-1 | |
int | 4 | 0 | -2^31~2^31-1 | |
long | 8 | 0 | -2^32-2^63-1 | |
浮点型 | float | 4 | 0.0f | -2^31~2^31-1 |
double | 8 | 0.0 | -2^63~2^63-1 | |
布尔型 | boolean | - | 0 | 0,1 |
字符型 | char | 2 | \u0000|空格|0 | 0~2^16-1 |
注意:没有String,String是引用类型。
其中,boolean的大小没有明确规定,在单独使用boolean时,通常JVM默认在编译后使用int数据类型来进行存储,可以提高执行效率。而如果使用了boolean[]等形式的数组,则使用byte类型来进行存储,具体需要看jvm虚拟机是否按照这种规范。
2、包装类
Java是一种面向对象的语言,绝大部分时间开发者都在对对象进行操作,而基本数据类型并不属于对象,因此需要对基本数据类型进行包装,八大基本类型的包装类分别为:Byte、Short、Integer、Long、Float、Double、Char、Boolean,大致上与基本数据类型命名方式相同,以Integer为例,包装类中指明了该类型数据的最大、最小值,用MAX_VALUE与MIN_VALUE来表示,同时也会提供一些便捷的数值操作方法,如将十进制转为十六进制的方法:Integer.toHexString(int i)、十进制转二进制的Integer.toBinaryString(int i)等。
在日常使用中我们经常用以下方式进行初始化:
Integer i = 1;
显然i是一个对象,但1是基本数据类型,为什么可以成功赋值呢?这里涉及到了Java的自动装箱机制,这段代码编译后实际执行的是:
Integer i = Integer.valueOf(1);
这句代码才是Integer对象实际的初始化方式,但日常开发中我们直接使用第一种方式即可,此外还有其他初始化方式:
Integer j = new Integer(1);
Integer k = new Integer("1");
类似的,Java还有自动拆箱机制,比如以下代码:
//自动装箱
Integer i = 1;
//自动拆箱,实际调用的是int l = i.intValue();
int l = i;
在日常开发中,如方法的参数列表中声明的是int或Integer,实际调用传另一种类型也可以,此处就是自动装箱与拆箱的应用。
3、其他
基本数据类型与其包装类还存在一些其他的差异,如基本数据一般保存在栈中,而包装类(即引用类型数据)保存在堆中,在栈中通过一个引用来指向包装类的实例对象,此处不作过深探讨。
日常开发中,推荐尽量使用包装类进行方法的接收参数声明,因为包装类的默认值都是null,即引用类型数据为空,由此可以判断传参是否存在错误,而使用基本数据类型时,由于默认值是0,难以判断传参是否发生错误。