一、简单数据类型转换
简单数据类型之间的转换又可以分为:
1.低级到高级的自动类型转换
2.高级到低级的强制类型转换
3.包装类过渡类型能够转换
上图,由低级到高级为:
(byte,short,char)–int–long–float–double
其中,byte型不能自动提升到char,char不能自动提升到short(强制转换不影响)。
在Java中,整数类型(byte/short/int/long)中,对于未声明数据类型的整形,其默认类型为int型。在浮点类型(float/double)中,对于未声明数据类型的浮点型,默认为double型。boolean类型与其他基本类型不能进行类型的转换(自动类型提升和强制类型转换),否则将编译出错。
long型转换为int的3种方法:
(1)强制
long ll = 300000;
int ii = (int)ll;
(2)调用intValue()方法
long ll = 300000;
int ii= new Long(ll).intValue();
(3)先把long转换成字符串String,然后再转
long ll = 300000;
int ii = Integer.parseInt(String.valueOf(ll));
易错示例:
byte a = 1000; // 编译出错 Type mismatch: cannot convert from int to byte
byte c = 3; // 编译正确
解释:jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(在此统一称为数值类型k,k可以是byte/char/short类型),会进行判断,如果此int型数值超过数值类型k,那么会直接编译出错。但如果此int型数值尚在数值类型k范围内,jvm会自定进行一次隐式类型转换,将此int型数值转换成类型k。
在其他情况下,当将一个数值范围小的类型a赋给一个数值范围大的数值型变量b,jvm在编译过程中将此数值的类型进行了自动提升,如:
int c = 1000;
long d = c;
float e = 1.5F;
double f = e;
但若超过了a类型的最大值,编译出错(10000000000默认是int类型,同时int类型的数值范围是-2^31 ~ 2^31-1):
long a = 10000000000; //编译出错: The literal 10000000000 of type int is out of range
long b = 10000000000L; //编译正确
在数值类型的自动类型提升过程中,数值精度至少不应该降低(整型保持不变,float->double精度将变高)。
二、字符串与其他数据类型转换
2.1 整数转为字符串
1.String s = String.valueOf(i); // 推荐
2.String s = Integer.toString(i);
3.String s = “” + i;
其它数据类型(double\float\long)可以利用同样的方法转换成字符串:
boolean d = true;
String s = Boolean.toString(d);
String s = new Boolean(b).toString();//将b利用对象封装器转化为对象,浪费内存
2.2 字符串转为整数
1.int i = Integer.parseInt(s);
字符串转换成byte, short, int, float, double, long等数据类型,可以分别参考Byte, Short, Integer,Float,Double,Long类的parseXXX方法。
Integer in=new Integer(Integer.parseInt(String s));
char转为整数:
char c = ‘8’;
int re = Integer.parseInt(c + “”);
或:int a = c-‘0’;
2.int i = Integer.valueOf(s).intValue();
Integer integer=Integer.valueOf(s);
Long l = Long.valueOf(s);
(1和2区别:Integer.valueof(String s)是将一个包装类是将一个实际值为数字的变量先转成string型再将它转成Integer型的包装类对象(相当于转成了int的对象)这样转完的对象就具有方法和属性了。而Integer.parseInt(String s)只是将是数字的字符串转成数字,返回的是int型变量不具备方法和属性。)
3.Integer in = new Integer(“123”);
2.3 String与char
1.String转char:
String s = “abc”;
**char c = s.charAt(0);
char[] ca = “123”.toCharArray();**
2.char转String:
char c = ‘2’;
**String s = String.valueOf(c);
String s = c.toString();**//任何类型都可采用toString()转换为String类型
三、object对象与其他的转换
3.1 object对象转换为String
1.Object.toString()
Object object = getObject();
System.out.println(object.toString());
任何严格意义上的java对象都可以调用此方法。但要注意,object不能是null值,否则将抛出NullPointerException异常。
2.类型转换(String)object
使用这种方法时,需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查,以判断是否可以转换。否则容易抛出CalssCastException异常。此外,需特别小心的是因定义为Object类型的对象在转成String时语法检查并不会报错,这可能导致潜在的错误存在。这时要格外小心。如:
Object obj = new Integer(100);
String strVal = (String)obj;
在运行时将会出错,因为将Integer类型强制转换为String类型,无法通过。但是
Integer obj = new Integer(100);
String strVal = (String)obj;
如上格式代码,将会报语法错误。
3.String.valueOf(Object)
String.valueOf(Object)的基础是Object.toString()。但它与Objec.toString()又有所不同。在前面方法1的分析中提到,使用1时需保证不为null。但采用方法3时,将不用担心object是否为null值这一问题。为了便于说明问题,我们来分析一下相关的源代码。Jdk里String. valueOf(Object)源码如下:
public static String valueOf(Object obj) {
return (obj == null) ? “null” : obj.toString();
}
隐患:当object为null时,String.valueOf(object)的值是字符串”null”,而不是Null
3.2 object对象转换为int
Integer转换成int为:int num=Integer.intValue();
同理还有byteValue()、shortValue()、longValue()、floatValue()、doubleValue()。
3.2 object对象和HashMap相互转换
示例:
HashMap先转为Object类型,然后再转换为HashMap输出。
Map<Long,Integer> map = new HashMap<Long,Integer>();
map.put(1l,1);
map.put(2l,2);
Set set1 = map.keySet();
for (Iterator iter = set1.iterator();iter.hasNext();) {
Long k = (Long)iter.next();
System.out.println(k + " " + map.get(k));
}
Object o = map;
System.out.println("object转换为map:");
if (o instanceof Map) {
map = (Map)o;
}
Set set2 = map.keySet();
for (Iterator iter = set2.iterator();iter.hasNext();) {
Long k = (Long)iter.next();
System.out.println(k + " " + map.get(k));
}
output:
1 1
2 2
object转换为map:
1 1
2 2
四、进制转换
4.1 十进制到其他进制的转换
1.Integer.toBinaryString(int i);
Integer和Long提供了toBinaryString,toHexString和toOctalString方法,可以方便的将数据转换成二进制、十六进制和八进制字符串。
byte, short, float和double等数据类型,可以利用Integer或者是Long的toBinaryString,toHexString,toOctalString和toString方法转换成其他进制的字符串形式。
2.Integer.toString(int/long i , int radix)
更强大的方法,可以将一个十进制数转换成任意进制的字符串形式。
Integer.toString(30, 16);
4.2 其他进制到十进制的转换
五进制字符串14414转换成十进制整数,结果是1234:
System.out.println(Integer.valueOf(“14414”, 5);
Integer和Long提供的valueOf(String source, int radix)方法,可以将任意进制的字符串转换成十进制数据。