Java中String.valueOf、toString、(String)的区别
原文地址http://blog.csdn.net/yangzhaomuma/article/details/51173138
原文地址https://www.cnblogs.com/xhyouyou/p/6014367.html
----------------------------------------------------------------------------------------------------------------------------------------
字符串类型的转型在java中常用的方法有标题中的三种。
简单介绍:
1、toString,需要保证调用这个方法的类、方法、变量不为null,否则会报空指针。
2、String.valueOf。这个方法在使用的时候是有些特殊的。一般情况下,如果是确定类型的null传入,返回的是字符串“null”,而如果直接传入null,则会发生错误。
3、(String) 字符串类型强转。需要保证的是类型可以转成String类型。
这里重点介绍valueOf。
举个例子:
- String teString=null;
- teString=String.valueOf(teString);
- System.out.println(teString);
这样的写法,因为确定了传入的是String类型,在valueOf调用对应构造函数时不会发生错误,因此,返回的是字符串“null”。
- String.valueOf(null);
但如果改为以上的写法,则提示空指针。
问题分析:为何会出现以上两种不同的结果,看源码我们即可知道原因。
valueOf有以下几种重载:
在代码中写下如下:
- boolean temp = false;
- String.valueOf(temp);
- char temp1 = 0;
- String.valueOf(temp1);
- double value = 0;
- String.valueOf(value);
- Object object=null;
- String.valueOf(object);
- float f = 0;
- String.valueOf(f);
- int i = 0;
- String.valueOf(i);
- long l = 0;
- String.valueOf(l);
- System.out.println("------------分割线---------------");
- //导致空指针
- char[] chars=null;
- String.valueOf(chars);
- //导致空指针
- String.valueOf(null, 0, 0);
运行后,可看到导致空指针的只可能是后面的两种方式。源码中valueOf(char[])会最终走到valueOf(char[],int,int)这个重载中,因此我们直接看对应的源码,如下:
- public String(char[] data, int offset, int charCount) {
- if ((offset | charCount) < 0 || charCount > data.length - offset) {
- throw failedBoundsCheck(data.length, offset, charCount);
- }
- this.offset = 0;
- this.value = new char[charCount];
- this.count = charCount;
- System.arraycopy(data, offset, value, 0, count);
- }
这里将导致空指针。
知道了导致空指针的原因,还有一个疑惑,那就是为什么String.valueOf(null),会走到valueOf(char[])这个重载,而不是其他重载呢?
因为java中对重载的匹配是,当重载都能匹配的时候,优先选择范围小,精度高的方法,因此,它自动重载了char[]这个方法。
通过以上,发现String.valueOf()方法是有可能出现null的。在使用时需要注意。
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在Java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能。本文将对常用的转换方法进行一个总结。
常用的方法有(String)要转换的对象,Object#toString(),String.valueOf(Object)等。
(String)
- 这是标准的类型转换,将object转成String类型的值。使用这种方法时,需要注意的是类型必须能转成String类型。因此最好用instanceof做个类型检查,以判断是否可以转换。否则容易抛出CalssCastException异常。此外,需特别小心的是因定义为Object 类型的对象在转成String时语法检查并不会报错,这将可能导致潜在的错误存在。这时要格外小心。如:
12
Object obj =newInteger(100);String strVal = (String)obj;
在运行时将会出错,因为将Integer类型强制转换为String类型,无法通过。

- toString
- 在这种使用方法中,因为java.lang.Object类里已有public方法.toString(),所以对任何严格意义上的java对象都可以调用此方法。但在使用时要注意,必须保证object不是null值,否则将抛出NullPointerException异常。采用这种方法时,通常派生类会覆盖Object里的toString()方法。


- String.valueOf
- 这个方法是静态的,直接通过String调用,可以说是完美,只是平时不习惯这样写而已,这样的实现避免了前面两个的不足和缺点。首先来看看他内部的实现机制:
123
publicstaticString valueOf(Object obj){return(obj==null) ?"null": obj.toString()};在内部就是做了为空的判断的,所以就不会报出空指针异常。
从上面的源码可以很清晰的看出null值不用担心的理由。但是,这也恰恰给了我们隐患。我们应当注意到,当object为null 时,String.valueOf(object)的值是字符串”null”,而不是null!!!在使用过程中切记要注意。
试想一下,如果我们用
123if(String.valueOf(object)==null){System.out.println(“传入的值是null!”);}这样的语句将可能会发生什么问题。再想一下,向控制台输出时,在视觉上如下语句在执行的结果上有什么不同:
Object obj = null;
System.out.println(String.valueOf(obj) + "->此处null的类型是" + String.valueOf(obj).getClass());
System.out.println(obj);我们看到的输出将是一模一样的东西:null,但它们意义相同吗?

- 总结:
这三者的使用,个人觉得应该使用String.valueOf()的方式。这样的使用安全可靠,不会带来异常。
Java中String.valueOf、toString、(String)的区别的更多相关文章
- Java中String字符串toString()、String.valueOf()、String强转、+ ""的区别
Object#toString(): Object object = getObject(); System.out.println(object.toString()); 在这种使用方法中,因为ja ...
- 转换String三种方式比较:toString()、String.valueOf()、(String)
简单介绍: 1.toString,需要保证调用这个方法的类.方法.变量不为null,否则会报空指针. 2.String.valueOf.这个方法在使用的时候是有些特殊的.一般情况下,如果是确定类型的n ...
- java中int转成String位数不足前面补零
java中int转成String位数不足前面补零 转载自:http://ych0108.iteye.com/blog/2174134 java中int转String位数不够前面补零 String.fo ...
- java中main方法的 (String []args)
java中main方法的 (String []args) String[] args是main函数的形式参数,可以用来获取命令行用户输入进去的参数.java 本身不存在不带String ...
- java中的switch用String作为条件
在开发java程序的过程中,我们遇到了条件推断首选就是switch,可是java中的switch功能不支持字符串作为条件.这时我们该怎么办呢? --使用枚举. 一.枚举简单了解 1.enum是一 ...
- Java中==、equals、hashcode的区别与重写equals以及hashcode方法实例(转)
Java中==.equals.hashcode的区别与重写equals以及hashcode方法实例 原文地址:http://www.cnblogs.com/luankun0214/p/4421770 ...
- java中的sleep()和wait()的区别
对于sleep()方法,我们首先要知道该方法是属于Thread类中的.而wait()方法,则是属于Object类中的. sleep()方法导致了程序暂停执行指定的时间,让出cpu该其他线程,但是他的监 ...
- java中的this与super的区别
java中的this与super的区别 1. 子类的构造函数如果要引用super的话,必须把super放在函数的首位 代码如下: class Base { Base() { System.out.pr ...
- JAVA中extends 与implements有啥区别?
JAVA中extends 与implements有啥区别?1. 在类的声明中,通过关键字extends来创建一个类的子类.一个类通过关键字implements声明自己使用一个或者多个接口.extend ...
- Java中instanceof和isInstance的具体区别
Java中instanceof和isInstance的具体区别 在Think in Java泛型这一章遇到这个问题,一些博客模糊提到了isInstance是instanceof的动态实现,查阅文档参考 ...
随机推荐
- 在OrangePI上搭建homeassitant过程记录
1.更换Python版本 由于在新版的homeassistant当中需要使用python3.5.3及以后的版本,但由于apt源中只包含3.5.2的版本,所以需要升级到python3.6. 具体更换方式 ...
- kubernetes和calico集成
硬件环境: 三台虚拟机: 192.168.99.129 master(kube-apiserver.kube-controller-manager.kube-proxy.kube-scheduler. ...
- 在windows下安装Redis步骤(收集)
一.下载windows版本的Redis 去官网找了很久,发现原来在官网上可以下载的windows版本的,现在官网以及没有下载地址,只能在github上下载,官网只提供linux版本的下载 官网下载地址 ...
- libxl库的介绍,对Excel操作封装得很好的一个库,兼容2007版和多字节字符(最后有破解版下载)
前段时间忙着毕业论文,终于有时间写博客了. 早些时候老大给我的一个任务需要对excel进行读表操作,研究了一下c++对excel的操作. 对Excel的操作基本有com,ODBC,AD等,其中ODBC ...
- thinkphp 从服务器拉取下来 验证码失效
public function verify(){ ob_end_clean();//加入 $verify = new \Think\Verify(); $verify->entry(1); }
- 字符串的数字部分递增,如user00000001后面的数字部分递增+1
使用存储过程方式 bengin declare@namevarchar(50) set@name=(selectmax(right('user00000001',8<8是从后往前数,从1开始&g ...
- 20140710文安c++面试总结
这次去文安面试并未是我想象中的那个样子,可能有如下原因: 1.招聘旺季已过,仅剩下c++这个职位 2.并未做过面试前大公司的面试技巧-做面试题 面试过程基本就是先做面试题: 1.试题分布式-逻辑题.分 ...
- python bottle学习(四)request.quest/query_string/params/body等方法介绍
假设url:http://0.0.0.0:18082/api/cluster/group?wzd=111&abc=cc 方法类型:POST,body是{"name":& ...
- redis问题集
Redis有哪些数据结构? 字符串String.字典Hash.列表List.集合Set.有序集合SortedSet. 如果你是Redis中高级用户,还需要加上下面几种数据结构HyperLogLog.G ...
- C++ 分割字符串两种方法
原文地址:http://blog.csdn.net/xjw532881071/article/details/49154911 字符串切割的使用频率还是挺高的,string本身没有提供切割的方法,但可 ...