Java的数据类型有两大类:一类是基本数据类型,一类是引用类型(包括String,数组)。
基本数据类型:
整数型:byte(8位)、short(16位)、int(32位)、long(64位)
浮点型:float(32位)、double(64位)
字符型:char(16位)用单引号赋值
布尔型:boolean(1位),只有true和false两种取值
基本数据类型引用类型的区别:
基本数据类型相比较使用“==”;引用类型相比较使用“equals”,使用时可以赋值为null;
基本数据类型的变量名指向具体数值;引用类型变量名指向存数据对象的内存地址;
数据转换
数据转换有两种情况,自动转换和强制转换;
符合下列条件Java会进行自动转换:
- 低精度向高精度转换,例如:int->double;【(byte,short,char) < int < long < float < double】
- 整数型和浮点星相运算,结果会变成浮点型。
强制转换:
强制转换可以使用“()”,可以按照自己的意愿进行转换,但有可能会丢失精度。
装箱和拆箱:
Java为每个基本数据类型都提供了包装类
基本数据类型与包装类的转换被称为装箱
和拆箱
。
装箱
(boxing)是将值类型转换为引用类型。例如:int
转Integer
- 装箱过程是通过调用包装类的
valueOf
方法实现的。
- 装箱过程是通过调用包装类的
拆箱
(unboxing)是将引用类型转换为值类型。例如:Integer
转int
- 拆箱过程是通过调用包装类的
xxxValue
方法实现的。(xxx 代表对应的基本数据类型)。
- 拆箱过程是通过调用包装类的
需要注意的是,自动装箱会隐式地创建对象,从而产生一些无用的中间对象,增加GC的压力,因此在写循环时应避免引入不必要的装箱操作。
JDK 5 之前的形式:
Integer i1 = new Integer(10); // 非自动装箱
复制代码
JDK 5 之后:
Integer i2 = 10; // 自动装箱
Java 对于自动装箱和拆箱的设计,依赖于一种叫做享元模式的设计模式
装拆箱的应用场景:
一种最普通的场景是:调用一个含类型为 Object
参数的方法,该 Object
可支持任意类型(因为 Object
是所有类的父类),以便通用。当你需要将一个值类型(如 int)传入时,需要使用 Integer
装箱。例如:ArrayList
装箱、拆箱应用注意点
- 装箱操作会创建对象,频繁的装箱操作会造成不必要的内存消耗,影响性能。所以应该尽量避免装箱。
- 基础数据类型的比较操作使用
==
,包装类的比较操作使用equals
方法。