🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## Java专题一:数据类型 [TOC] | 数据类型 |封装类 | |--|--| |byte | Btye | |short| Short| |int| Integer| |long| Long| |float| Float| |double| Double| |boolean| Boolean| |String| -| ### 1.1. 数据类型分类 - 基本数据类型:`byte`、`short`、`int`、`long`、`float`、`double`、`boolean` - 引用数据类型:对象Object,包括`String` ### 1.2. 浮点类型 float、double的精确计算 先做一个简单的减法运算: ~~~ System.out.println(4.0-3.6); ~~~ 输出为`0.3999999999999999`,跟我们的预期`0.4`结果完全不同,没有精确表示,这时可以用BigDecimal来精确计算,计算结果为`0.4` ~~~ BigDecimal b1 = BigDecimal.valueOf(4.0); BigDecimal b2 = BigDecimal.valueOf(3.6); System.out.println(b1.subtract(b2)); ~~~ ### 1.3. byte、short、int、long的封装类型缓存机制 Btye、Short、Integer、Long类中都存在内部私有类ByteCache、ShortCache、IntegerCache、LongCache,这些内部类都是为了支持Java的自动装箱机制操作(参考第2点)。 ```java Integer i1 = 1; Integer i2 = 1; System.out.println(i1==i2); ``` 答案是true, 一般前后声明2个对象,直接使用运算符==判断相等都是返回false,但这里返回的是true,是因为IntegerCache机制,i1和i2是同一个对象。 ### 1.4. 自动装箱与拆箱 在java中,有时你可能会怀疑如下问题: **问题一**:对象怎么可以直接赋值给一个基本数据类型呢? ```java int a = new Integer(12); ``` **问题二**:对于元素固定为封装数据类型的集合类来说,怎么能插入基本数据类型呢? ```java List list = new ArrayList<Integer>(); list.add(12); ``` 其实在问题一可以分解成如下代码: ```java Integer aa = new Integer(12); int a = aa.intValue(); ``` 问题二可以分解成如下代码: ```java List list = new ArrayList<Integer>(); Integer aa = Integer.valueOf(12); list.add(aa); ``` 这些就是Java中默认在基本数据类型和封装数据类型之间的默认转换,也成为自动装箱和自动拆箱,再总结一下: **自动装箱:** 基本数据类型自动转换成对应封装类型, 如int转为Integer对象。 **自动拆箱:** 封装类型自动转换成对应基本数据类型,如Integer对象转为int。