自动类型转换
- 整型、实型(常量)、字符型数据可以混合运算。
运算中,不同类型的数据先转化为同一类型,然后进行运算。
转换从低级到高级。
低 ------------------------------------> 高
byte,short,char —> int —> long—> float —> double - 数据类型转换必须满足如下规则:
・不能对boolean类型进行类型转换。
・不能把对象类型转换成不相关类的对象。
・在把容量大的类型转换为容量小的类型时必须使用强制类型转换。
・转换过程中可能导致溢出或损失精度,例如:
int i = 128;
byte b = (byte)i;
因为 byte 类型是 8 位,最大值为127,所以当 int 强制转换为 byte 类型时,值 128 时候就会导致溢出。
・浮点数到整数的转换是通过舍弃小数得到,而不是四舍五入,例如:
(int)23.7 == 23;
(int)-45.89f == -45; - 必须满足转换前的数据类型的位数要低于转换后的数据类型。
例如: short数据类型的位数为16位,就可以自动转换位数为32的int类型,
同样float数据类型的位数为32,可以自动转换为64位的double类型。
char c1=‘a’; //定义一个char类型
int i1 = c1; //char自动类型转换为int
System.out.println(“char自动类型转换为int后的值等于” + i1); // 97
char c2 = ‘A’; //定义一个char类型
int i2 = c2+1; //char 类型和 int 类型计算
System.out.println(“char类型和int计算后的值等于” + i2); // 66
解析计算过程:c1 的值为字符 a ,查 ASCII 码表可知对应的 int 类型值为 97,
A 对应值为 65,所以 i2=65+1=66。
强制类型转换
- 条件是转换的数据类型必须是兼容的。
- 格式:(type)value type是要强制类型转换后的数据类型。
实例:int i = 123; byte b = (byte)i; // 强制类型转换为byte System.out.println("int强制类型转换为byte后的值等于" + b); // 123
包装类转换
-
To String
int i = 13; String s = Integer.toString(i); float f = 12.34f; String s = Float.toString(f);
-
To Integer or int
// 创建 Integer 实例 Integer i = 128; Integer i = new Integer(128); // Java9以后不推荐 // 转成 Integer 实例 Integer i = Integer.valueOf(9); // f = 9 Integer i = Integer.valueOf("444",16); // 使用 16 进制, x = 1092 // 转成 int 类型 int i = Integer.parseInt("9"); int i = Integer.parseInt("444", 16); // 使用 16 进制, i = 1092
-
To Float or float
// 创建 Float 实例 Float f = 3.14; Float f = new Float(3.14); // Java9以后不推荐 Float f = new Float("3.14"); // Java9以后不推荐 // 转成 Float 实例 Float f = Float.valueOf(80); // f = 80.0 Float f = Float.valueOf("80"); // f = 80.0 // 转成 Float 类型 float f = Float.parseFloat("3.14");
-
To Double or double
// 创建 Double 实例 Double d = new Double("6.35"); // d = 6.35 // 转成 Double 实例 Double d = Double.valueOf(5); // d = 5.0 // 转成 double 类型 double d = Double.parseDouble("5"); // d = 5.0
-
To BigDecimal
// 创建 BigDecimal 实例 BigDecimal b = new BigDecimal("20.15"); // 参数只能用String类型 BigDecimal b = new BigDecimal(20.15); // 可以运行,但是会按照double进行计算,丢失精度。比如: 20.15 - 10.10 = 10.04999999999999。 // 转成 BigDecimal 实例 BigDecimal b = BigDecimal.valueOf(20.15); // int float double 都可以
-
To Hex (16进制字符串)
// Double or double String hex = Double.toHexString(20.15);
-
相关资料
valueOf
一些转换方法
- String转byte[]
调用String类的getBytes()方法。
public static byte[] strToByteArray(String str) {
if (str == null) {
return null;
}
byte[] byteArray = str.getBytes();
return byteArray;
}
- byte[]转String
使用String的构造方法之一。
方法具体的转换过程较为复杂,其实就是将byte数组的一个或多个元素按指定的Charset类型读取并转换为char类型(char本身就是以Unicode编码方式存储的),因为String类的核心是其内部维护的char数组。
public static String byteArrayToStr(byte[] byteArray) {
if (byteArray == null) {
return null;
}
String str = new String(byteArray);
return str;
}
- byte[]转十六进制String
所谓十六进制String,就是字符串里面的字符都是十六进制形式,因为一个byte是八位,可以用两个十六进制位来表示,因此,byte数组中的每个元素可以转换为两个十六进制形式的char,所以最终的HexString的长度是byte数组长度的两倍。
public static String byteArrayToHexStr(byte[] byteArray) {
if (byteArray == null){
return null;
}
char[] hexArray = "0123456789ABCDEF".toCharArray();
char[] hexChars = new char[byteArray.length * 2];
for (int j = 0; j < byteArray.length; j++) {
int v = byteArray[j] & 0xFF;
hexChars[j * 2] = hexArray[v >>> 4];
hexChars[j * 2 + 1] = hexArray[v & 0x0F];
}
return new String(hexChars);
}
- 十六进制String转byte[]
就是byte[]转十六进制String的逆过程
public static byte[] hexStrToByteArray(String str)
{
if (str == null) {
return null;
}
if (str.length() == 0) {
return new byte[0];
}
byte[] byteArray = new byte[str.length() / 2];
for (int i = 0; i < byteArray.length; i++){
String subStr = str.substring(2 * i, 2 * i + 2);
byteArray[i] = ((byte)Integer.parseInt(subStr, 16));
}
return byteArray;
}