String.valueOf()与Object.toString()

在Java中, String.valueOf(Object)Object.toString()是否有区别? 是否有一个特定的代码约定呢?

根据Java文档 , String.valueOf()返回:

如果参数为null ,那么一个string等于"null" ; 否则,返回obj.toString()的值。

所以除了附加的方法调用之外,不应该有任何区别。

而且,在Object#toString情况下,如果实例为null ,则会抛出NullPointerException ,所以可以说是不太安全的

String.valueOf(Object)和Object.toString()之间的区别是:

1) 如果string为空,

String.valueOf(Object )将打印null,而Object.toString()将抛出空指针exception。

 public static void main(String args[]){ String str = null; System.out.println(String.valueOf(str)); // it will prints null System.out.println(str.toString()); // it will throw NullPointer Exception } 

2) 签名:

String类的valueOf()方法是静态的。 而String类的toString()方法是非静态的。

string的valueOf()方法的签名或语法如下所示:

 public **static** String valueOf(boolean b) public **static** String valueOf(char c) public **static** String valueOf(char[] c) public **static** String valueOf(int i) public **static** String valueOf(long l) public **static** String valueOf(float f) public **static** String valueOf(double d) public **static** String valueOf(Object o) 

string的toString()方法的签名或语法如下所示:

 public String toString() 

在Java中,String.valueOf(Object)和Object.toString()是否有区别?

是。

正如javadoc所解释的, String.valueOf(null)将被视为一种特殊情况,而null.toString()只会给你一个NPE。

是否有一个特定的代码约定呢?

没有。

使用哪种方法最适合您所使用环境的要求。 (你需要格式化为null吗?)

注意:这不是一个代码约定。 这只是常识编程。 更重要的是,你的代码是正确的,而不是遵循一些文体惯例或“最佳实践”的教条。


个人想法:

一些开发商获得了(IMO)针对空值“捍卫”的坏习惯。 所以你会看到很多的空值testing,并将空值视为特殊情况。 这个想法似乎阻止了NPE的发生。

我认为这是一个坏主意。 特别是,我认为,如果你发现一个null时候你所做的就是试图“做好”,而不考虑为什么会出现null

一般来说,最好先避免null的存在,除非它在应用程序或APIdevise中有非常具体的含义。 所以,与其避免使用很多防御性编码的NPE,最好是让NPE发生,然后追踪并修复触发NPE的意外null的来源。

那么这怎么适用?

那么,如果你想一想,使用String.valueOf(obj) 可能是一个“做得好”的方法。 这是要避免的。 如果obj在上下文中是null的,最好使用obj.toString()

String.valueOf(Object)Object.toString()几乎是一回事。

如果你看看String.valueOf(Object)的实现,你会发现String.valueOf(Object)基本上只是适当对象的toString()的一个空安全的调用:

 Returns the string representation of the Object argument. Parameters: obj an Object. Returns: if the argument is null, then a string equal to "null"; otherwise, the value of obj.toString() is returned. See also: Object.toString() public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); } 

最重要的区别是它们处理空string引用的方式。

 String str = null; System.out.println("String.valueOf gives : " + String.valueOf(str));//Prints null System.out.println("String.toString gives : " + str.toString());//This would throw a NullPointerExeption 

下面显示了jdk8u25源代码中描述的java.lang.String.valueOf的实现。 所以根据我的评论,没有任何区别。 它调用“Object.toString”。 对于原始types,它将其包装在其对象forms中,并在其上调用“toString”。

见下文:

 /* * Copyright (c) 1994, 2013, Oracle and/or its affiliates. All rights reserved. * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. */ public static String valueOf(Object obj) { return (obj == null) ? "null" : obj.toString(); } public static String valueOf(char data[]) { return new String(data); } public static String valueOf(char data[], int offset, int count) { return new String(data, offset, count); } public static String copyValueOf(char data[], int offset, int count) { return new String(data, offset, count); } public static String copyValueOf(char data[]) { return new String(data); } public static String valueOf(boolean b) { return b ? "true" : "false"; } public static String valueOf(char c) { char data[] = {c}; return new String(data, true); } public static String valueOf(int i) { return Integer.toString(i); } public static String valueOf(long l) { return Long.toString(l); } public static String valueOf(float f) { return Float.toString(f); } public static String valueOf(double d) { return Double.toString(d); } 

当参数为nullString.valueOf返回"null" ,但Object.toString抛出NullPointerException ,这是唯一的区别。

我不能确切地说明差异是什么,但是在字节级操作时似乎有区别。 在下面的encryptionscheme中,Object.toString()产生了一个无法解密的值,而String.valueOf()按照预期工作。

 private static char[] base64Encode(byte[] bytes) { return Base64.encode(bytes); } private static String encrypt(String encrypt_this) throws GeneralSecurityException, UnsupportedEncodingException { SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWithMD5AndDES"); SecretKey key = keyFactory.generateSecret(new PBEKeySpec(PASSWORD)); Cipher pbeCipher = Cipher.getInstance("PBEWithMD5AndDES"); pbeCipher.init(Cipher.ENCRYPT_MODE, key, new PBEParameterSpec(SALT, 20)); //THIS FAILED when attempting to decrypt the password //return base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8"))).toString(); //THIS WORKED return String.valueOf(base64Encode(pbeCipher.doFinal(encrypt_this.getBytes("UTF-8")))); }//end of encrypt() 

这两种方法之间还有一个主要区别是当我们正在转换的对象是一个数组。

当你使用Object.toString()来转换一个数组的时候,你会得到一些垃圾值(@后跟数组的哈希码)。

为了得到一个可读的toString(),你必须使用String.valueOf(char []); 请注意,此方法仅适用于chartypes的数组。 我build议使用Arrays.toString(Object [])将数组转换为String。

第二个区别是当对象为null时,ValueOf()返回一个String“null”,而toString()将返回空指针exception。