📓 本文已归档到:「blog」html
Java 中的数据类型有两类:java
String
、数组)Java 语言提供了 8 种基本类型,大体分为 4 类git
byte
- 8 位。short
- 16 位。int
- 32 位。long
- 64 位,赋值时通常在数字后加上 l
或 L
。float
- 32 位,直接赋值时必须在数字后加上 f
或 F
。double
- 64 位,赋值时通常在数字后加 d
或 D
。char
- 16 位,存储 Unicode 码,用单引号赋值。boolean
- 只有 true 和 false 两个取值。==
号。equals
方法。👉 扩展阅读:Java 基本数据类型和引用类型github
这篇文章对于基本数据类型和引用类型的内存存储讲述比较生动。设计模式
Java 中,数据类型转换有两种方式:数组
通常状况下,定义了某数据类型的变量,就不能再随意转换。可是 JAVA 容许用户对基本类型作有限度的类型转换。post
若是符合如下条件,则 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 对于自动装箱和拆箱的设计,依赖于一种叫作享元模式的设计模式(有兴趣的朋友能够去了解一下源码,这里不对设计模式展开详述)。
👉 扩展阅读:深刻剖析 Java 中的装箱和拆箱
结合示例,一步步阐述装箱和拆箱原理。
Object
参数的方法,该 Object
可支持任意类型(由于 Object
是全部类的父类),以便通用。当你须要将一个值类型(如 int)传入时,须要使用 Integer
装箱。Object
。因而,要将值类型数据加入容器时,须要装箱。==
运算符的两个操做,一个操做数是包装类,另外一个操做数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。示例:
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]
示例说明:
上面的例子,虽然简单,但却隐藏了自动装箱、拆箱和非自动装箱、拆箱的应用。从例子中能够看到,明明全部变量都初始化为数值 10 了,但为什么会出现
i1 == i2 is [false
而i1 == i4 is [true]
?缘由在于:
- i一、i2 都是包装类,使用
==
时,Java 将它们当作两个对象,而非两个 int 值来比较,因此两个对象天然是不相等的。正确的比较操做应该使用equals
方法。- i1 是包装类,i4 是基础数据类型,使用
==
时,Java 会将两个 i1 这个包装类对象自动拆箱为一个int
值,再代入到==
运算表达式中计算;最终,至关于两个int
进行比较,因为值相同,因此结果相等。
==
,包装类的比较操做使用 equals
方法。(1)Java 中的数据类型有两类:
byte
、short
、int
、long
、float
、double
、char
、boolean
)String
、数组)(2)Java 中,数据类型转换有两种方式:
强制转换使用括号 ()
。
基础数据类型能够自动转换,转换原则以下:
(3)包装类有以下种类:
Byte <-> byte Short <-> short Integer <-> int Long <-> long Float <-> float Double <-> double Character <-> char Boolean <-> boolean
(4)什么是装箱、拆箱
装箱
(boxing)是将值类型转换为引用类型。例如:int
转 Integer
valueOf
方法实现的。拆箱
(unboxing)是将引用类型转换为值类型。例如:Integer
转 int
xxxValue
方法实现的。(xxx 表明对应的基本数据类型)。(5)装箱、拆箱的应用场景
Object
参数的方法==
运算符的两个操做,一个操做数是包装类,另外一个操做数是表达式(即包含算术运算)则比较的是数值(即会触发自动拆箱的过程)。(6)装箱、拆箱的应用注意点
==
,包装类的比较操做使用 equals
方法。