답변:
에 따르면 자바 문서 , String.valueOf()
반환 :
인수가이면
null
문자열과"null"
; 그렇지 않으면의 값obj.toString()
이 반환됩니다.
따라서 추가 메소드 호출을 제외하고는 실제로 차이가 없어야합니다.
또한의 경우 Object#toString
인스턴스가 인 null
경우 a NullPointerException
가 발생하므로 덜 안전 합니다.
public static void main(String args[]) {
String str = null;
System.out.println(String.valueOf(str)); // This will print a String equal to "null"
System.out.println(str.toString()); // This will throw a NullPointerException
}
String.valueOf(null)
.NPE입니다. null 인 객체에 대해서만 작동합니다.
String.valueOf(null)
사실로 확인 valueOf(char[])
과부하. char[]
보다 구체적인 유형 이기 때문 입니다 Object
.
String.valueOf (Object)와 Object.toString ()의 차이점은 다음과 같습니다.
1) 문자열이 null이면
String.valueOf(Object)
null 포인터 예외가 발생 null
하지만 을 반환 Object::toString()
합니다.
public static void main(String args[]){
String str = null;
System.out.println(String.valueOf(str)); // it will print null
System.out.println(str.toString()); // it will throw NullPointerException
}
2) 서명 :
String 클래스의 valueOf () 메소드는 정적입니다. 반면 String 클래스의 toString () 메소드는 정적이 아닙니다.
문자열 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)
문자열 toString()
메소드 의 서명 또는 구문 은 다음과 같습니다.
public String toString()
Java에서 String.valueOf (Object)와 Object.toString () 사이에 차이점이 있습니까?
예. (과부하를 고려한다면 더 그렇습니다!)
javadoc이 설명 하듯이 메소드에 String.valueOf((Object) null)
의해 특별한 경우로 취급되고 valueOf
값 "null"
이 리턴됩니다. 대조적 null.toString()
으로 NPE를 제공합니다.
그것은 밝혀 String.valueOf(null)
(! 차이를주의) 하지 javadoc가에도 불구하고 ... NPE을 제공합니다. 설명이 모호합니다.
의 과부하에는 여러 가지가 String.valueOf
있지만 여기에 관련된 두 가지가 있습니다 : String.valueOf(Object)
및 String.valueOf(char[])
.
이 식에서 는 할당이 모든 참조 유형과 호환 되므로 String.valueOf(null)
두 과부하 모두 적용 가능null
합니다.
적용 가능한 과부하 가 둘 이상 있는 경우 JLS는 가장 특정한 인수 유형에 대한 과부하 가 선택 되었다고 말합니다 .
이후 char[]
의 하위 유형입니다 Object
, 그것은이다 더 구체적인 .
따라서 String.valueOf(char[])
과부하가 호출됩니다.
String.valueOf(char[])
인수가 널 배열 인 경우 NPE를 처리합니다. 와 달리 특별한 경우로 String.valueOf(Object)
취급되지 않습니다 null
.
호출 javap -c
이있는 메소드의 코드를 검사 하여 이를 확인할 수 있습니다 String.valueOf(null)
. 호출에 사용 된 과부하를 관찰하십시오.
또 다른 예는 valueOf(char[])
과부하 의 차이를 훨씬 더 명확하게 보여줍니다.
char[] abc = new char[]('a', 'b', 'c');
System.out.println(String.valueOf(abc)); // prints "abc"
System.out.println(abc.toString()); // prints "[C@...."
이에 대한 특정 코드 규칙이 있습니까?
아니.
사용하는 컨텍스트의 요구 사항에 가장 적합한 것을 사용하십시오. ( 작동하려면 서식 이 필요 합니까?null
합니까?)
참고 : 이것은 코드 규칙이 아닙니다. 그냥 상식 프로그래밍입니다. 어떤 문체 규칙이나 "모범 사례"교리를 따르는 것보다 코드가 올바른 것이 더 중요합니다 .
개인적인 의견 :
일부 개발자는 null에 대해 "방어"하는 나쁜 습관을 (IMO) 얻습니다. 따라서 널에 대한 많은 테스트와 널을 특수한 경우로 취급합니다. 아이디어는 NPE가 발생하는 것을 막는 것 같습니다.
나는 이것이 나쁜 생각이라고 생각합니다. 특히, 당신이 찾을 때 당신이하는 일 null
이 왜 거기에 있었는지를 고려하지 않고 "좋은 것"을 시도 하는 것이 나쁜 생각이라고 생각합니다 null
.
일반적으로 응용 프로그램이나 API 디자인에 매우 특별한 의미가 null
없다면 처음에는 존재하지 않는 null
것이 좋습니다. 따라서 많은 방어 코딩으로 NPE를 피하는 대신 NPE가 발생하도록 한 다음 NPE null
를 트리거 한 예기치 않은 원인을 추적하고 수정하는 것이 좋습니다.
여기 어떻게 적용됩니까?
글쎄, 당신이 그것에 대해 생각하면 사용 하는 "좋은"방법 String.valueOf(obj)
이 될 수 있습니다. 피해야합니다. 위해 예기치 않은 상황이라면 obj
수 null
맥락에서, 그것을 사용하는 것이 좋습니다 obj.toString()
.
대부분 다른 답변에서 이미 언급되었지만 완전성을 위해 추가합니다.
.toString()
의 구현이 아니므로 a 를 갖지 Object
않으므로 사용할 String.valueOf
수 있습니다.String.valueOf
이다 주어진 객체 변환 할 null
문자열을 "null"
, 반면 .toString()
발생합니다 NullPointerException
.String.valueOf
비슷한 것을 사용할 때 기본적으로 String s = "" + (...);
사용합니다. 그렇기 때문에 NPE가 아닌 Object t = null; String s = "" + t;
String이 "null"
됩니다. StringBuilder.append
, not 을 사용합니다 String.valueOf
. 그래서 내가 여기서 말한 것을 무시하십시오.그뿐만 아니라, 여기에 사용 사례 실제로 String.valueOf
와 .toString()
다른 결과를 가지고는 :
다음과 같은 일반적인 방법이 있다고 가정 해 봅시다.
public static <T> T test(){
String str = "test";
return (T) str;
}
그리고 우리는 Integer
이것을 다음과 같은 유형으로 부를 것입니다 : Main.<Integer>test()
.
문자열을 만들면 String.valueOf
정상적으로 작동합니다.
String s1 = String.valueOf(Main.<Integer>test());
System.out.println(s1);
test
STDOUT으로 출력 됩니다.
.toString()
그러나 다음 과 같이 작동하지 않습니다.
String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);
다음과 같은 오류가 발생합니다.
java.lang.ClassCastException
: 클래스java.lang.String
를 클래스로 캐스트 할 수 없습니다java.lang.Integer
이유에 관해서는 이 분리 된 질문과 그 답변을 참조 할 수 있습니다 . 그러나 간단히 말해서 :
.toString()
먼저 컴파일에 캐스팅 객체, 평가합니다 T
(AN입니다 String
에 Integer
이 경우 캐스트)가 발생됩니다 ClassCastException
.String.valueOf
하면 컴파일 T
하는 Object
동안 일반 을 볼 수 있으며 심지어는 신경 쓰지 않아도 Integer
됩니다. 따라서 컴파일러가 무시 하는 Object
to 를 캐스팅합니다 Object
. 그런 다음을 사용 하여 예상대로 String.valueOf(Object)
결과 String
를 얻습니다. 따라서 매개 변수가 내부적으로 매개 변수에 대한 String.valueOf(Object)
작업을 수행 하더라도 .toString()
캐스트를 건너 뛰고을 처리 하여의 사용으로 발생 Object
하는 ClassCastException
것을 피했습니다 .toString()
.여기 String.valueOf
와 .toString()
여기의 추가 차이점을 언급 할 가치가 있다고 생각했습니다 .
("" + x)
String.valueOf(x)
에 있었지만 컴파일 된 것이 더 복잡했지만 더 복잡한 것은 StringBuffer
(우리는 없었습니다 StringBuilder
).
String.valueOf(Object)
그리고 Object.toString()
말 그대로 같은 일이다.
당신의 구현을 살펴 가지고가는 경우에 한 String.valueOf (개체) , 당신은 볼 수 있습니다 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();
}
두 메소드 사이에 한 가지 더 큰 차이점은 변환하려는 객체가 배열 일 때입니다.
Object.toString ()을 사용하여 배열을 변환하면 일종의 가비지 값 (@ 뒤에 배열의 해시 코드)이 나타납니다.
사람이 읽을 수있는 toString ()을 얻으려면 String.valueOf (char []);를 사용해야합니다. plz는이 메소드가 char 유형의 Array에만 작동한다는 점에 유의하십시오. 배열을 String으로 변환하기 위해 Arrays.toString (Object [])을 사용하는 것이 좋습니다.
두 번째 차이점은 객체가 null 인 경우 ValueOf ()는 문자열 "null"을 반환하지만 toString ()은 null 포인터 예외를 반환합니다.
차이점이 무엇인지 정확하게 말할 수는 없지만 바이트 수준에서 작동 할 때 차이가있는 것으로 보입니다. 다음 암호화 시나리오에서 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()
valueOf(char[])
하기보다는 전화 하는 것 valueOf(Object)
입니다. 의 동작은와 valueOf(char[])
크게 다릅니다 char[].toString()
. 그러나 어느 쪽이든,이 답변은 질문이 요구하는 것과 다른 과부하를 호출하기 때문에 제안 되지 않습니다 .
아래는 jdk8u25의 소스에서 설명한 java.lang.String.valueOf의 구현을 보여줍니다. 내 의견에 따르면 아무런 차이가 없습니다. "Object.toString"을 호출합니다. 프리미티브 유형의 경우,이를 객체 형태로 랩핑하고 "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);
}
String.valueOf
. 사용됩니다. toString을 재정의하는 객체의 경우 String.valueOf가 대신 호출 할 수 있다고 생각합니다. 그래도 그 부분에 대해서는 확실하지 않습니다.