在用Java写算法题时,经常需要进行字符串转字符数组、字符串转整型等各数据类型间的转换,此文章将对这些转换方法进行总结,避免混淆各转换方法的使用。
-
任意类型 转 String
Java提供了三种方法将其他类型的数据转成String类,分别是String.valueOf()、toString()和(String)强转。
-
toString()
八大基本类型没有toString()方法。
toString()是Object类中的方法,而Java中所有的类都继承Object类,也就是说所有的对象都可以调用toString()方法,但并不一定能达到想要的效果。
首先是八大封装类Boolean、Byte、Character、Short、Integer、Long、Float、Double,这些类的对象在调用toString()方法时,由于类中已经重写过toString()方法,所以返回的就是对应值的字符串形式。例如:
Integer a = 1;
System.out.print(a.toString()); //输出结果就是字符串"1"(不含引号)
Boolean b = true;
System.out.print(b.toString()); //输出结果就是字符串"true"(不含引号)
但对于自定义类的对象或是数组对象,若是没有重写toString()方法,其返回值会是一段用于表示此对象的文本字符串,格式为:getClass().getName() + "@" + Integer.toHexString(hashCode()。例如:
char[] a = {'1','2','3'};
System.out.println(a.toString()); //输出结果:[C@65b3120a
此外,由于toString()是属于所有对象的方法,那必然会遇见调用toString()方法的对象为空的情况,若是对象为空,则调用结果会报空指针异常NullPointException()。
因此,toString()方法不常用于写算法题,而常用于通过重写对象的toString()方法来输出对象的属性。例如:
class Student{
private String name,age;
public Student(String name,String age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
String str = "该名学生的姓名为:"+name+",年龄为:"+age;
return str;
}
}
重写方法后,当调用toString()时就可以获取代表该对象信息的字符串。对于写算法题时用到的类型转换,常用另一种方法:String.valueOf()。
2.String.valueOf()
String.valueOf()是String类中的静态方法,无需通过对象调用,可用于将八大基本数据类型boolean、byte、char、short、int、long、float、double转成数值对应的字符串形式。且String.valueOf()对于八大包装类也同样适用。在这点上toString()和String.valueOf()所能达到的效果是一致的,因为String.valueOf()就是通过将八大基本数据类型转成对应八大包装类再调用toString()方法实现的。
同样地,对于没有重写toString()方法的对象,若是调用String.valueOf()其结果也是一段格式为getClass().getName() + "@" + Integer.toHexString(hashCode()的字符串。
Integer a = 1;
System.out.print(a.toString()); //输出结果为字符串"1"(不含引号)
int aa = 1;
System.out.print(String.valueOf(aa)); //输出结果为字符串"1"(不含引号)
Student s = new Student();
System.out.print(s.toString()); //输出结果为字符串"Student@6f539caf"(不含引号)
Student ss = new Student();
System.out.print(String.valueOf(ss)); //输出结果为字符串"Student@6f539caf"(不含引号)
但不同点在于,String.valueOf()可以将char[]数组转成对应字符串。但需注意是char[]数组,不是Character[]数组。
char[] b = {'1','2','3'};
Character[] c = {'1','2','3'};
System.out.println(b.toString()); //输出结果:[C@65b3120a
System.out.println(String.valueOf(b)); //输出结果:123
System.out.println(String.valueOf(c)); //输出结果:[Ljava.lang.Character;@65b3120a
除此之外,String.vlueOf()并不会报空指针异常,当对象为空时,返回值为字符串"null"。
比较,String.valueOf()比toString()更适合用于写算法题的原因有两点:
(1)toString()只能包装类使用,而String.valueOf()既可以用于基本数据类型也可以用于包装类。
(2)String.valueOf()多了将字符数组转字符串的功能。
3.(String)强转
这种方法不推荐使用。
首先,(String)强转用于将一个Object对象转成String类型,其只能适用于Object对象,不管是八大基本数据类型、八大包装类还是自定义类都不能用。
此外,即使是Object对象,也只能是底层为字符串类型的对象才能使用(String)强转。例如:
//底层为String
Object a = "hi";
System.out.print((String)a); //输出结果:hi
//底层为Character
Object b = 'hi';
System.out.print((String)b); //结果报错:java.lang.ClassCastException
//底层为Integer
Object c = 1;
System.out.print((String)c); //结果报错:java.lang.ClassCastException
因此,使用(String)强转时,最好使用instanceof做一个类型检查,以判断是否可以进行强转,否则容易抛出ClassCastException异常。
Object a = 1;
if(a instanceof String){
String b = (String)a;
System.out.println(b);
}else{
System.out.print("类型转换错误");
}
//运行结果:类型转换错误
最后,若Object对象为空,使用(String)强转的结果是返回空值null。
比较,当对象为空时,调用三种转字符串的方法:
(1)调用toString()会报空指针异常;
(2)调用String.valueOf()会返回字符串"null";
(3)调用(String)强转会返回空值null。
4.Arrays类
Arrays是java.util包中的一个类,该类继承于Object类,用于操纵数组。Arrays类重写了toString方法,可以将各种数据类型的数组转成字符串String。但是该字符串的值是以数组形式呈现的。例如:
Integer[] a = {1,2,3};
System.out.println(Arrays.toString(a)); //输出结果:[1, 2, 3]
Character[] b = {'a','b','c'};
System.out.println(Arrays.toString(b)); //输出结果:[a, b, c]
char[] c = {'a','b','c'};
System.out.println(Arrays.toString(c)); //输出结果:[a, b, c]
上述输出结果中的"[1, 2, 3]"和"[a, b, c]"均是字符串而不是数组。
综上所述,使用String.valueOf()将基本类型数据转字符串是最佳选择。
-
String 转 char[]数组
toCharArray()
toCharArray()方法将String对象按单个字符切分作为元素,返回一个char[]数组。是最常用的String转char[]方法。
String a = "happy";
char[] aa = a.toCharArray();
for(int i=0;i<aa.length;i++){
System.out.print(aa[i]+" ");
}
//输出结果:h a p p y
-
String 转 Number类
parseXXX()
六大数字类Byte、Short、Integer、Long、Float、Double均提供各自的字符串转该类的静态方法,且返回值可以是对应的基本数据类型或包装类。例如:
int i1 = Integer.parseInt("1");
System.out.println(i1); //输出结果:1
Integer i2 = Integer.parseInt("1");
System.out.println(i2); //输出结果:1
XXX.parseXXX(String s,int radix); s是具有正确格式的字符串,radix是待转换的字符串所表示的数值的基数。
此处需注意两点:
(1)s需具有正确的格式
int i1 = Integer.parseInt("1");
System.out.println(i1); //输出结果:1
int i2 = Integer.parseInt("1.2");
System.out.println(i2); //结果报错:NumberFormatException
int i3 = Integer.parseInt("1a");
System.out.println(i3); //结果报错:NumberFormatException
(2)radix指的是待转换的字符串对应数值的进制数,不是要转换成的数值的进制数
int i1 = Integer.parseInt("11",10);
System.out.println(i1); //输出结果:11。 1*10^0 + 1*10^1 = 11
int i2 = Integer.parseInt("11",2);
System.out.println(i2); //输出结果:3。 1*2^0 + 1*2^1 = 3
在使用此方法时,radix默认为10,若待转换的字符串就是10进制数形式,则radix可不写。