在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反编译工具进行测试。