to String(),String.valueOf(),toCharArray()等类型转换方法

        在用Java写算法题时,经常需要进行字符串转字符数组、字符串转整型等各数据类型间的转换,此文章将对这些转换方法进行总结,避免混淆各转换方法的使用。

  • 任意类型 转 String

Java提供了三种方法将其他类型的数据转成String类,分别是String.valueOf()、toString()和(String)强转。

  1. 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可不写。

  • 21
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值