## 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。
- JavaCook
- Java专题零:类的继承
- Java专题一:数据类型
- Java专题二:相等与比较
- Java专题三:集合
- Java专题四:异常
- Java专题五:遍历与迭代
- Java专题六:运算符
- Java专题七:正则表达式
- Java专题八:泛型
- Java专题九:反射
- Java专题九(1):反射
- Java专题九(2):动态代理
- Java专题十:日期与时间
- Java专题十一:IO与NIO
- Java专题十一(1):IO
- Java专题十一(2):NIO
- Java专题十二:网络
- Java专题十三:并发编程
- Java专题十三(1):线程与线程池
- Java专题十三(2):线程安全与同步
- Java专题十三(3):内存模型、volatile、ThreadLocal
- Java专题十四:JDBC
- Java专题十五:日志
- Java专题十六:定时任务
- Java专题十七:JavaMail
- Java专题十八:注解
- Java专题十九:浅拷贝与深拷贝
- Java专题二十:设计模式
- Java专题二十一:序列化与反序列化
- 附加专题一:MySQL
- MySQL专题零:简介
- MySQL专题一:安装与连接
- MySQL专题二:DDL与DML语法
- MySQL专题三:工作原理
- MySQL专题四:InnoDB存储引擎
- MySQL专题五:sql优化
- MySQL专题六:数据类型
- 附加专题二:Mybatis
- Mybatis专题零:简介
- Mybatis专题一:配置文件
- Mybatis专题二:映射文件
- Mybatis专题三:动态SQL
- Mybatis专题四:源码解析
- 附加专题三:Web编程
- Web专题零:HTTP协议
- Web专题一:Servlet
- Web专题二:Cookie与Session
- 附加专题四:Redis
- Redis专题一:数据类型
- Redis专题二:事务
- Redis专题三:key的过期
- Redis专题四:消息队列
- Redis专题五:持久化