数据类型分类
Java 中的数据类型有两类:
String
值类型
Java 语言提供了 8 种基本类型, 大致分为 4 类
整数型
byte - 8 位.
short - 16 位.
int - 32 位.
long - 64 位, 赋值时一般在数字后加上 l 或 L .
浮点型
float - 32 位, 直接赋值时必须在数字后加上 f 或 F .
double - 64 位, 赋值时一般在数字后加 d 或 D .
字符型
char - 16 位, 存储 Unicode 码, 用单引号赋值.
布尔型
boolean - 只有 true 和 false 两个取值.
值类型和引用类型的区别
从概念方面来说
基本类型: 变量名指向具体的数值.
引用类型: 变量名指向存数据对象的内存地址.
从内存方面来说
基本类型: 变量在声明之后, Java 就会立刻分配给他内存空间.
引用类型: 它以特殊的方式 (类似 C 指针) 向对象实体(具体的值), 这类变量声明时不会分配内存, 只是存储了一个内存地址.
从使用方面来说
equals
这篇文章对于基本数据类型和引用类型的内存存储讲述比较生动.
数据转换
Java 中, 数据类型转换有两种方式:
自动换行
强制转换
自动转换
一般情况下, 定义了某数据类型的变量, 就不能再随意转换. 但是 JAVA 允许用户对基本类型做 有限度 的类型转换.
如果符合以下条件, 则 JAVA 将会自动做类型转换:
由小数据转换为大数据
显而易见的是,"小" 数据类型的数值表示范围小于 "大" 数据类型的数值表示范围, 即精度小于 "大" 数据类型.
所以, 如果 "大" 数据向 "小" 数据转换, 会丢失数据精度. 比如: long 转为 int, 则超出 int 表示范围的数据将会丢失, 导致结果的不确定性.
反之,"小" 数据向 "大" 数据转换, 则不会存在数据丢失情况. 由于这个原因, 这种类型转换也称为 扩大转换 .
这些类型由 "小" 到 "大" 分别为:(byte,short,char) <int < long < float < double.
这里我们所说的 "大" 与 "小", 并不是指占用字节的多少, 而是指表示值的范围的大小.
转换前后的数据类型要兼容
由于 boolean 类型只能存放 true 或 false, 这与整数或字符是不兼容的, 因此不可以做类型转换.
整型类型和浮点型进行计算后, 结果会转为浮点类型
示例:
- long x = 30;
- float y = 14.3f;
- System.out.println("x/y =" + x/y);
输出:
x/y = 1.9607843
可见 long 虽然精度大于 float 类型, 但是结果为浮点数类型.
强制转换
在不符合自动转换条件时或者根据用户的需要, 可以对数据类型做强制的转换.
强制转换使用括号 () .
引用类型也可以使用强制转换.
示例:
- float f = 25.5f;
- int x = (int)f;
- System.out.println("x =" + x);
装箱和拆箱
包装类, 装箱, 拆箱
Java 中为每一种基本数据类型提供了相应的包装类, 如下:
- Byte <-> byte
- Short <-> short
- Integer <-> int
- Long <-> long
- Float <-> float
- Double <-> double
- Character <-> char
- Boolean <-> boolean
引入包装类的目的就是: 提供一种机制, 使得 基本数据类型可以与引用类型互相转换 .
基本数据类型与包装类的转换被称为 装箱 和 拆箱 .
装箱 (boxing)是将值类型转换为引用类型. 例如: int 转 Integer
装箱过程是通过调用包装类的 valueOf 方法实现的.
拆箱 (unboxing)是将引用类型转换为值类型. 例如: Integer 转 int
拆箱过程是通过调用包装类的 xxxValue 方法实现的.(xxx 代表对应的基本数据类型).
自动装箱, 自动拆箱
基本数据 (Primitive) 型的自动装箱 (boxing) 拆箱 (unboxing) 自 JDK 5 开始提供的功能.
JDK 5 之前的形式:
Integer i1 = new Integer(10); // 非自动装箱
JDK 5 之后:
Integer i2 = 10; // 自动装箱
Java 对于自动装箱和拆箱的设计, 依赖于一种叫做享元模式的设计模式(有兴趣的朋友可以去了解一下源码, 这里不对设计模式展开详述).
- Integer i1 = 10; // 自动装箱
- Integer i2 = new Integer(10); // 非自动装箱
- Integer i3 = Integer.valueOf(10); // 非自动装箱
- int i4 = new Integer(10); // 自动拆箱
- int i5 = i2.intValue(); // 非自动拆箱
- System.out.println("i1 = [" + i1 + "]");
- System.out.println("i2 = [" + i2 + "]");
- System.out.println("i3 = [" + i3 + "]");
- System.out.println("i4 = [" + i4 + "]");
- System.out.println("i5 = [" + i5 + "]");
- System.out.println("i1 == i2 is [" + (i1 == i2) + "]");
- System.out.println("i1 == i4 is [" + (i1 == i4) + "]"); // 自动拆箱
- // Output:
- // i1 = [10]
- // i2 = [10]
- // i3 = [10]
- // i4 = [10]
- // i5 = [10]
- // i1 == i2 is [false]
- // i1 == i4 is [true]
- Byte <-> byte
- Short <-> short
- Integer <-> int
- Long <-> long
- Float <-> float
- Double <-> double
- Character <-> char
- Boolean <-> boolean
来源: http://www.bubuko.com/infodetail-2984673.html