## 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專題五:持久化