toString()、String.valueOf()、(String)区别

2019/11/15

 在Java中,把一个类型的变量转换成String 类型。常用的方法:toString()、String.valueOf()、(String);

toString()方法

API中关于toString()的描述:

返回该对象的字符串表示。通常,toString 方法会返回一个“以文本方式表示”此对象的字符串。结果应是一个简明但易于读懂的信息表达式。建议所有子类都重写此方法。

 public String toString() {
        return getClass().getName() + "@" + Integer.toHexString(hashCode());
 }

Object 类的 toString 方法返回一个字符串,该字符串由类名(对象是该类的一个实例)、at 标记符“@”和此对象哈希码的无符号十六进制表示组成。换句话说,该方法返回一个字符串,它的值等于: getClass().getName() + ‘@’ + Integer.toHexString(hashCode())

toString()方法返回的是这个对象的字符串表示,就像是这个对象的名字一样,任何对象都可以有自己的名字,你可以重写其toString()方法,给其赋予任意的名字。

调用toString()方法的对象不能为 null,否则会抛出异常:java.lang.NullPointerException。

String.valueOf()方法

源码:

    /**
     * Returns the string representation of the <code>Object</code> argument.
     *
     * @param   obj   an <code>Object</code>.
     * @return  if the argument is <code>null</code>, then a string equal to
     *          <code>"null"</code>; otherwise, the value of
     *          <code>obj.toString()</code> is returned.
     * @see     java.lang.Object#toString()
     */
    public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
    }

这个方法在调用 toString() 之前判断一下这个对象是不是null,如果不是null,则正常调用其toString()方法,如果是null 的话,则返回字符串形式的null。

String.valueOf() 比起直接用 toString() 来说避免了空指针异常,但是要注意如果用if(String.valueOf(object)==null) 是有问题的。为valueOf方法是返回的一个字符串,并不是返回的一个对象,如果要比较也得用 “null”.equals(object)。

System.out.println(String.valueOf(null)); System.out.println(null); 我们看到的输出将是一模一样的东西:null,但意义不一样。

强制转换 (String)data

优点:不用担心data 为 null, 缺点:不是String类型的对象强转成String会类型转换异常,因此最好用instanceof做个类型检查,以判断是否可以转换。

例一:

Integer obj1 = new Integer(100); String strVal = (String)obj1;  //Cannot cast from Integer to String 因为obj1 在创建的时候就是 Integer 类型,不能转换成 String 类型,所以在编译期间就会报错Cannot cast from Integer to String。

例二:

Object obj2 = new Integer(100); String strVal = (String)obj2; obj2 虽然本质上是 Integer 类型,但其表面上确是 Object 类型,所以在编译的时候没有报错,但因为 obj2 在创建的时候已经确定了其在本质上 Integer 类型,所以这两行代码在运行时依然会报错,因为 Integer 型不能转换成 String 类型。

当然,如果要把 Integer 型转换成 String,可以调用其 toString()方法:Integer.toString(obj1) 或者 String.valueOf(obj1); 对应于其他自定义类型,则调用自己重写的 toString() 方法。

此外,因null值可以被强制转换为任何类型,所以(String)null也是合法的。

object + “”

字符串相加,最终输出是String类型,其实这个是运算符重载的结果,任何Object与String相加最终输出是String类型。

但是!请注意,只要是使用相加符号的字符串,都会自动new一个StringBuilder去append,效率上会增加多一个对象的容量消耗,所以建议不要使用这种方式去处理字符串。

但是以上说法也不一定是正确的,现在JDK在编译时会做优化,比如直接:System.out.println(“hello world” + 1 “easonjim”),那么编译器会转成System.out.println(“hello world1easonjim”)。

但是!如果你在额外的地方定义了一个变量再组装时和其它Object类型组装时,同样也会是使用StringBuilder去append。

这些做法可以使用jad反编译工具进行测试。

Post Directory