如下图,Java中的数据类型可以分为基本数据类型和引用数据类型两大类。
基本数据类型有8种:整型(byte、short、int、long)、浮点型(float、double)、字符型(char)、布尔类型(boolean);
引用数据类型有3种:类(Class)、接口(interface)、数组([ ])。
针对上述两大类数据类型,我们先后介绍基本数据类型间的转换以及基本数据类型和引用数据类型间的转换。
此外,java中的基本数据类型都有对应的包装类型,最后介绍一下基本数据类型和对应包装类型间的转换。
一、基本数据类型间的转换
Java语言中,基本数据类型间的转换一般分两种情况:自动类型转换和强制类型转换:
1. 自动类型转换:编译器自动完成类型转换,无需自己写代码进行转换。
转换规则:从存储范围小的类型转换为存储范围大的类型。
8种基本数据类型的大小和存储范围(注:表中数据类型的取值范围均为有符号类型,对于数值型类型来说,最高位都是符号位):
数据类型 | 存储大小 | 取值范围 | 默认值 | 包装类 |
boolean | 1/8 字节(1 位) | true,false | false | Boolean |
byte | 1字节(8 位) | -2^7 ~ 2^7-1 | 0 | Byte |
char | 2字节(16 位) | u0000~uFFFF (即Unicode 0 ~ Unicode 2^16-1) | '0' | Character |
short | 2字节(16 位) | -2^15 ~ 2^15-1 | 0 | Short |
int | 4字节(32 位) | -2^31 ~ 2^31-1 | 0 | Integer |
long | 8字节(64 位) | -2^63 ~ 2^63-1 | 0L | Long |
float | 4字节(32 位) | -2^128 ~ 2^127 | 0.0f | Float |
double | 8字节(64 位) | -2^1024 ~ 2^1023 | 0.0d | Double |
具体转换规则:byte、short、char → int → long → float → double
注:(1)java将byte、short、char的表示范围归为一个层次,因此这三种数据类型不会相互转换,它们在计算的时候首先都
会自动转换为int型;
(2)当多种数据类型的数据进行混合运算时,java会先将所有数据转换为表示范围最大的那个数据类型然后再进行运算
(3)浮点型常量(如1.23)默认的数据类型为double型,整型常量(如1)默认的数据类型为int型。
2. 强制类型转换:需要自己写代码强制编译器完成类型转换。
转换规则:从存储范围大的类型转换为存储范围小的类型。
具体转换规则:double → float → long → int → byte、short、char
代码的语法格式:(想要转换到的数据类型)需要转换的数值变量
例子:
double d1 = 3.14159265358979;
double d2 = 1227;
float f = (float) d1; //3.1415927 (精度损失)
int i1 = (int) d1; //3 (精度损失)
int i2 = (int) d2; //1227 (精度无损失)
注:类型转换通常在数值处理中出现,而boolean类型的数据不是数值,因此基本数据类型的转换一般不考虑boolean数据和其他7种类型数据的转换。
二、基本数据类型和String类数据间的转换
Java 的字符串类型String是一个类,是一种引用数据类型。在引用数据类型中,通常只存在String类型和基本数据类型间的转换。并且,不同基本数据类型和String类型数据的转换原理相同,方法相似。
1. 基本数据类型转换成String类型
(1)String.valueOf(num):推荐,此方法最佳
String类中提供了将基本数据类型转换成String类型的static方法:也就是String.valueOf(object),只产生一个对象。源码如下:
public static String valueOf(Object obj){
return (obj==null)?"null":obj.toString();
}
注: 当参数为null时,该方法返回字符串“null”,而不是null。
用法:String.valueOf(int i) : 将 int 变量 i 转换成字符串;
String.valueOf(char c) : 将 char 变量 c 转换成字符串 ;
String.valueOf(char[] data) : 将 char 数组 data 转换成字符串 ;
......其他数据类型用法类似。
(2)Object.toString(num)
注:使用时必须保证参数不是null值,否则会抛出NullPointerException异常。
用法:Integer.toString(int i) : 将 int 变量 i 转换成字符串;
Character.toString(char c) : 将 char 变量 c 转换成字符串 。
......其他数据类型用法类似。
可以看出,String类的静态方法valueOf()的实现调用了Object类的toString()方法,并且增加了对null值的判断。
2. String类型转换成基本数据类型
将String类型转换成基本数据类型,最好的方法是使用基本数据类型的包装类调用String类的静态方法。
用法:Integer.parseInt(String str) : 将String类型的变量str转换成int型数值;
Double.parseDouble(String str) : 将String类型的变量str转换成double型。
......其他数据类型用法类似。
三、基本数据类型和对应包装类型间的转换
基本类型与其对应的包装类型之间的转换可以使用自动装箱与拆箱完成。8种基本数据类型对应的包装类型如第一章表格中所示,这里以int类型和对应的Integer类型间的转换为例:
Integer x = 2; // 装箱 调用了 Integer.valueOf(2)
int y = x; // 拆箱 调用了 X.intValue()
intValue() 是java.lang.Number类的方法,Number类是一个抽象类,java中的所有数值类都继承这个类。
补充:Java为什么要定义基本数据类型的包装类型?
(1)基本数据类型不具备对象的特征,而包装类型相当于将基本数据类型包装起来,使它具备了对象的特征,并为其添加了属性和方法,丰富了基本数据类型的操作;
(2)当需要往List、Map等容器中放置东西时,int、double这类基本数据类型的数据是放不进去的,这时候就需要它们对应的包装类型了。
四、int数据和char型数组的转换
(1)int型数据转换为char型数组
int N = 12345;
//int型数据转化为字符数组,是先将int型数据转化为String类型数据,然后借助String类的toCharArray()方法
char[] c = String.valueOf(N).toCharArray();
(2)char型数组转换为int型数据
//char型数组转换为int型数据,是先借助String类的valueOf(char[])方法将char型数组转换为String型数据,然后借助Integer类的parseInt()方法将String数据转换为int型数据的
String s = String.valueOf(c); //char型数组转化为String类型
int N = Integer.parseInt(s); //String类型数据转化为int型数据