1.问题
在开发中,有很多时候需要将Object类型转成String。如调用一个方法,其返回的类型是Map<String, Object>类型,当对返回结果进行解析时,很可能需要将Object类型的value转成String类型,那么怎么转换是比较好的方式呢?
2.实现方式及分析
常用的方式应该有如下三种:
public class ToStringTest {
@SuppressWarnings("unused")
public static void main(String[] args) {
//从接口中获取到的
Map<String, Object> resultMap = new HashMap<String, Object>();
resultMap.put("strKey", "1");
resultMap.put("intKey", new Integer(1));
//将结果中某个字段转换成String类型
//情形1
String aStr1 = (String) resultMap.get("strKey"); //方式1-1
String aStr2 = resultMap.get("strKey").toString(); //方式1-2
String aStr3 = String.valueOf(resultMap.get("strKey")); //方式1-3
//情形2
String bStr1 = (String) resultMap.get("intKey"); //方式2-1 -> 类型转换异常
String bStr2 = resultMap.get("intKey").toString(); //方式2-2
String bStr3 = String.valueOf(resultMap.get("intKey")); //方式2-3
//情形3
String Str1 = (String) resultMap.get("nullKey"); //方式3-1
String cStr2 = resultMap.get("nullKey").toString(); //方式3-2 --> 空指针异常
String cStr3 = String.valueOf(resultMap.get("nullKey"));//方式3-3
}
}
做个简单分析:
以上代码对将Map中的Object转换成String类型的三种方式进行了比较:
- 对于情形1,即Object类型的value所指向的对象原来就是String时,这三种方式都是可以的
- 对于情形2,即Object类型的value所指向的对象原来是int类型时,使用(String)这种方式强转会出现ClassCastException。出现类型转换异常是因为将从Map中get得到Object类型通过(String)的方式强转成String类型前,会进行类型检查,发现Object类型的value指向的对象并不是String类型,所以会出现ClassCastException。这个可通过对代码进行反编译看出:
- 对于情形3,即获取的key在Map中不存在时,使用toString()方式进行转换会出现NullPointerException。出现NPE很好理解,因为从Map中get得到的是null,对null调用toString()方法自然会出现空指针。这里还需要注意的是,使用方式3-1、3-3转换后得到的不是null,而是字符串"null"。当需要对转换后的字符串进行比较时特别需要注意这一点
3.总结
通过以上分析,个人认为还是使用String.valueOf()的方式将Object类型转换成String类型会比较稳妥,但是需要注意null通过String.valueOf()转换后得到的是"null"(字符串)。
以上内容只是个人看法,如有错误之处,欢迎各位指正。