programing

String.valueOf()와오브젝트.toString()

itsource 2022. 8. 7. 17:26
반응형

String.valueOf()와오브젝트.toString()

에 차이가 요?String.valueOf(Object) ★★★★★★★★★★★★★★★★★」Object.toString()이 코드에는 특정 코드 표기법이 있습니까?

자바 문서에 따르면String.valueOf()★★★★

null에 에 하는 문자열입니다."null"그 이외의 , 의 값; " " " " " 입니다.obj.toString()이 반환됩니다.

따라서 추가 메서드 호출을 제외하고는 차이가 없습니다.

또, 「」의 는, 「」입니다.Object#toStringnull ,a ,aNullPointerException투척될 것이기 때문에, 거의 틀림없이, 덜 안전합니다.

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(객체)와 Object.toString()의 차이는 다음과 같습니다.

1) 문자열이 늘인 경우

String.valueOf(Object)"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 클래스의 value Of() 메서드는 스태틱입니다.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() 사이에 차이가 있습니까?

네. (과부하를 고려한다면 더욱 그렇습니다!)

자바독이 설명하듯이String.valueOf((Object) null)됩니다.valueOf 및 값 " " ""null"이 반환됩니다. by by by by bynull.toString()NPE를 사용하다

과부하

보니, ★★★★★★★★★★★★★★★★★★.String.valueOf(null)(차이에 주의해 주세요!)는 javadoc에도 불구하고 NPE를 제공합니다.진짜 설명은1 불명확합니다.

  1. String.valueOf하는 두 ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ, ㄴ.String.valueOf(Object) ★★★★★★★★★★★★★★★★★」String.valueOf(char[]).

  2. 으로.String.valueOf(null)이 두 가지 과부하가 모두 적용됩니다.null는 모든 참조 유형과 호환되는 할당입니다.

  3. 적용 가능한 오버로드가 2개 이상 있는 경우 JLS는 가장 구체적인 인수유형의 오버로드가 선택된다고 합니다.

  4. ★★char[]는 의 입니다.Object, 보다 구체적입니다.

  5. 에, 「 」는,String.valueOf(char[])과부하가 호출됩니다.

  6. String.valueOf(char[])NPE를 사용하다★★★★★★★★★★★★★★★와 달리String.valueOf(Object)은 다루지 , 것은은 , , , 。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

주의: 이것은 코드 규칙이 아닙니다.그것은 단지 상식적인 프로그래밍이다.어떤 스타일의 관례나 "베스트 프랙티스" 원칙을2 따르는 것보다 코드가 정확한지 확인하는 것이 더 중요합니다.


- 이 사실은 1 - 다면 알 수 .javap -cString.valueOf(null)합니다. 콜에 사용되는 과부하를 확인합니다.

2 - "베스트 프랙티스 없음"을 읽고 프로그래밍 또는 IT 도메인에서 무언가를 실행하는 것이 "베스트 프랙티스"라고 말하는 다음 사람에게 이 레퍼런스를 전달합니다.


개인적인 의견

일부 개발자는 늘에 대해 "방어"하는 (IMO) 나쁜 습관을 갖게 됩니다.따라서 null에 대한 검정과 null을 특수한 경우로 취급하는 검정도 많이 볼 수 있습니다.NPE의 발생을 막기 위한 아이디어인 것 같습니다.

건건 、 은은은은않각 。아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아,아아,아,아,아,아,아,아,아,아,아,아,아,아,아.null '좋게'가 않고 '이다. 왜 그런 일이 있었는지에 대한 고려 없이nullcontract.discontracts.

것이 .null,null응용 프로그램 또는 API 설계에는 매우 특별한 의미가 있습니다.코딩을 보다, 치 않은 「NPE」의.nullNPE의

그럼 이건 어떻게 적용되는 거죠?

요, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아.String.valueOf(obj) '착하게 만드는' 방법이 될 수 있어요그것은 피해야 할 것이다.예기치 않은 경우objnull이문서,, 하는좋좋 in in in in in이다를 하는 것이 .obj.toString().

대부분은 이미 다른 답변에 의해 언급되었지만, 저는 단지 완성도를 높이기 위해 덧붙입니다.

  1. .toString()은, 「」의 때문에,Object- only - " 、 " 래 -"String.valueOf사용할 수 있습니다.
  2. String.valueOf합니다.null " " 에 합니다."null"에 , ,는..toString()NullPointerException.
  3. 컴파일러는 이와 같은 것을 사용할 때 기본적으로 사용됩니다. 그 때문에, NPE 가 아니고, String 이 됩니다.편집: 실제로는,StringBuilder.append 아니라, 이에요.String.valueOf★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★♪

에도 실제로 를 들 수 .String.valueOf ★★★★★★★★★★★★★★★★★」.toString()다른 결과를 가져옵니다.

예를 들어 다음과 같은 일반적인 방법이 있습니다.

public static <T> T test(){
  String str = "test";
  return (T) str;
}

요.Integer합니다.Main.<Integer>test().

음음음음 when when when when when when when when when 를 사용하여 문자열을 String.valueOf정상적으로 동작합니다.

String s1 = String.valueOf(Main.<Integer>test());
System.out.println(s1);

출력됩니다.testSTDOUT の st st st st st st st st st st st

.toString()하지만, 작동하지 않을 것:동작하지 않습니다.

String s2 = (Main.<Integer>test()).toString();
System.out.println(s2);

이로 인해 다음과 같은 오류가 발생합니다.

java.lang.ClassCastException:수업:클래스java.lang.String수업 수업할수 없다로 캐스팅될 수 없습니다.java.lang.Integer

온라인으로 시험해 보세요.

그 이유에 대해서는, 이 분리된 질문과 그 답을 참조할 수 있습니다.단, 간단히 말하면:

  • 언제 사용시를 사용하여.toString()먼저고 평가하는 출연진오브젝트를 컴파일하고 평가합니다 먼저에 개체, 컴파일할 것이다.여기서 출연자는T(그것은(이것은String로.Integer. 이 사건을이경우 캐스팅)은다음과 같이 됩니다로 이어질 것이다.ClassCastException..
  • 언제 사용시를 사용하여String.valueOf그것은 제네릭 일반적인정보를볼 수 있습니다를 볼것이다.T~하듯이로Object동안 편찬과 그것에 대해 신경 쓰지 않는 컴파일 할 때,심지어신경도 안 쓰고.Integer. 그래서던질 것이다 캐스트를 그래서 그것은을 드리울 것이다.Object로로 합니다.Object(어느 쪽인가 하면) '이렇게'를 사용합니다.String.valueOf(Object)그 「」가 .String역시나그래서 비록String.valueOf(Object) .toString()변수에서는 , 이 변수는 '을 건너뛰었다', '배역하다', '배역하다', '하다', '배역하다', '배역하다', '배역하다', '배역하다', '배역하다', '배역하다', '배역하다', '배역하다', '배역하다', '배역하다 '배역하다,Object 해서 .ClassCastException'''를 하면 발생합니다..toString().

다른 점을 언급할 가치가 있을 것 같아서요String.valueOf ★★★★★★★★★★★★★★★★★」.toString()여기도 있어요.

가장 중요한 차이점은 늘 문자열 참조를 처리하는 방법입니다.

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

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();
}

가 " " 인 null , . . . . . . . .String.valueOf"null"Object.toStringNullPointerException그게 유일한 차이점이야

두 방법 사이에는 변환하는 객체가 배열일 때 한 가지 큰 차이가 있습니다.

Object.toString()을 사용하여 배열을 변환하면 일종의 가비지 값(@ 뒤에 배열의 해시 코드)이 표시됩니다.

사람이 읽을 수 있는 toString()을 얻으려면 String.valueOf(char[];plz를 사용해야 합니다.이 메서드는 Array of type char에서만 동작합니다.어레이를 String으로 변환하려면 Arrays.toString(Object[])을 사용할 것을 권장합니다.

두 번째 차이점은 개체가 null일 때 ValueOf()는 문자열 "null"을 반환하고 toString()은 null 포인터 예외를 반환합니다.

String.valueOf()는 toString() 메서드가 필요 없는 원시 유형과 함께 사용할 수 있습니다.

어떤 차이가 있는지 정확히 말할 수는 없지만 바이트 레벨로 동작할 때는 차이가 있는 것 같습니다.다음 암호화 시나리오에서는 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()

다음은 java.lang의 구현을 나타냅니다.string.valueOf는 jdk8u25 소스에 설명되어 있습니다.그래서 제 코멘트대로 차이가 없어요.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);
    }

언급URL : https://stackoverflow.com/questions/27465731/string-valueof-vs-object-tostring

반응형