基本数据类型
基本数据类型有8个,可以分为4个小类,分别是整数类型(byte、short、int、long)、浮点类型、字符类型(char)、布尔类型(boolean)。
在java中基本数据类型:基本数据类型并不具备对象的性质:无属性/无方法调用,但是能简单、有效地进行常规数据处理。
基本数据类型 | 所占内存大小 |
---|---|
byte | 1byte |
short | 2byte |
int | 4byte |
long | 8byte |
float | 4byte |
double | 8byte |
char | 2byte |
boolean | 1byte/4byte |
在《Java虚拟机规范中》中指出boolean的变量是被当作int类型来处理的,而boolean数组的操作,则与操作byte数组等价。
这些基本数据类型进行自动类型转换时,会由小精度转换为大精度。
但是需要注意,(byte,short)和char之间是无法进行自动类型转换的。当byte,short或char这三者中,任意一种或多种类型参与运算时,都会默认转换为int类型。
但是在很多时候不能用基本数据类型,而是对应的包装类,比如集合和equals函数中,参数就是Object对象
包装类型
为了让基本数据类型也具备对象的特征而引申出的类型。为基本数据类型添加了属性和方法,丰富了基本数据类型的操作。
基本数据类型 | 包装类型 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
针对基本数据类型和包装类型的转换有两个操作:装箱(基础类型转包装类型) 和 拆箱(包装类型转基础类型)。
在一些情况下,编译器会自动完成装箱或者拆箱操作:
- ArrayList、 HashMap等集合类添加基础类型数据时(装箱)
- 进行比较运算(拆箱)
- 使用equals进行比较(装箱)
- 进行算数运算(拆箱)
- 赋值操作(装箱或拆箱)
基本数据类型和包装类的区别
- 定义不同。包装类属于对象,基本数据类型不是
- 声明和使用方式不同。包装类使用new初始化,有些集合类的定义不能使用基本数据类型,例如 ArrayList
- 初始值不同。包装类默认值为null,基本数据类型则不同的类型都有其特定的初始值,如下图:
基本数据类型 | 默认初始值 |
---|---|
byte | 0 |
short | 0 |
int | 0 |
long | 0L |
float | 0.0F |
double | 0.0 |
char | ‘\u0000’ |
boolean | false |
4.存储方式和位置不同,从而性能不同。基本数据类型存储在栈(stack)中,包装类则分成引用和实例,引用在栈(stack)中,具体实例在堆(heap)中。
equals和 == 的区别
equals()函数比较的是Object对象里的数值,涉及到拆箱和装箱操作
对于基本数据类型,== 比较的是值,而对于包装类型,== 比较的则是2个对象的内存地址。
Java对部分经常使用的数据采用缓存技术,在类第一次被加载时换创建缓存和数据。当使用等值对象时直接从缓存中获取,从而提高了程序执行性能。(通常只对常用数据进行缓存,且只有valueOf方法构造对象时会用到缓存,new方法等不会使用缓存)
- Integer类型有缓存-128-127的对象。缓存上限可以通过配置jvm更改
- Byte,Short,Long类型有缓存(-128-127)
- Character缓存0-127
- Boolean缓存TRUE、FALSE
下面举一个代码例子:
Integer a1 = 20;
Integer b1 = 20;
System.out.println(a1 == b1);
Integer a2 = 200;
Integer b2 = 20;
System.out.println(a2 == b2);
在上述代码中,将基本数据类型的值赋值给包装类型,例如Integer a1 = 20 会调用到Integer.valueof(20),从上文可以知道,当数值在-128-127之间时,是直接从缓存中取出,所以a1和b1指向同一个地址;a2和b2由于不在缓存范围之内,所以会new一个Integer包装类,所以指向不同地址。所以,最终结果为:
true
false