Programing

정수.toString(into i) vs String.valueOf(int i)

c10106 2022. 5. 23. 20:43
반응형

정수.toString(into i) vs String.valueOf(int i)

는 왜 그 이 있는지 .String.valueOf(int i)존재하십니까?변환하기 위해 이 방법을 사용하고 있다.intString그리고 방금 그 사실을 발견했다.Integer.toString(int i)방법의

이러한 방법의 실행을 살펴본 결과, 첫 번째 방법이 두 번째 방법이라고 부르는 것을 보았다.그 결과 내 모든 전화는String.valueOf(int i)직통 전화보다 한 통 더 많은 전화를 걸다Integer.toString(int i)

문자열 유형에는 여러 메서드 값Of가 있다.

static String   valueOf(boolean b) 
static String   valueOf(char c) 
static String   valueOf(char[] data) 
static String   valueOf(char[] data, int offset, int count) 
static String   valueOf(double d) 
static String   valueOf(float f) 
static String   valueOf(int i) 
static String   valueOf(long l) 
static String   valueOf(Object obj) 

우리가 알 수 있듯이, 그러한 방법들은 모든 종류의 숫자를 해결할 수 있다.

귀하가 제시한 것과 같은 구체적인 방법의 모든 구현:그래서 정수를 위해 우리는

Integer.toString(int i)

2배로

Double.toString(double d)

등등

내 생각에 이것은 역사적인 것은 아니지만, 개발자가 그 방법을 사용하는 것이 더 유용하다.valueOf올바른 유형보다 스트링 클래스에서 작업 중인 유형을 변경하고 싶을 때 변경해야 할 사항이 적기 때문에

샘플 1:

public String doStuff(int num) {

  // Do something with num...

  return String.valueOf(num);

 }

샘플2:

public String doStuff(int num) {
  
 // Do something with num...
 
 return Integer.toString(num);

 }

샘플 2에서 보듯이 우리는 샘플 1과 반대로 두 가지 변경을 해야 한다.

제은은을 한다면,valueOf스트링 클래스의 메서드가 더 유연하고 그래서 거기서 사용할 수 있다.

한 가지 큰 차이점은 만약 여러분이toString()무효한 목적에서 당신은 a를 받게 될 것이다.NullPointerException반면, 사용String.valueOf()무효 여부를 확인할 수 없다.

같은 일을 하는 두 가지 다른 방법일 뿐이야.역사적 이유일 수도 있다(어떤 것이 다른 것보다 먼저 왔는지 기억할 수 없다).

String 클래스는 모든 원시 유형과 Object 유형에 대한 valueOf 메소드를 제공하므로, 나는 그것들이 하나의 클래스를 통해 모두 액세스할 수 있는 편의 방법이라고 생각한다.

NB 프로파일링 결과

평균 intToString = 5368ms, 평균 문자열ValueOf = 5689ms(100,000,000개 작업)

public class StringIntTest {


    public static long intToString () {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = Integer.toString(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static long stringValueOf () {

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = String.valueOf(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static void main(String[] args) {
        long intToStringElapsed = 0;
        long stringValueOfElapsed = 0;
        for (int i = 0; i < 10; i++) {
            intToStringElapsed += intToString();
            stringValueOfElapsed+= stringValueOf();
        }
        System.out.println("Average intToString = "+ (intToStringElapsed /10));
        System.out.println("Average stringValueOf = " +(stringValueOfElapsed / 10));
    }
}

Java 원본:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}

그래서 그들은 정확히 같은 결과를 주고 한 명은 다른 한 명을 부른다. String.valueOf나중에 유형을 변경할 수 있다면 더 유연하다.

에 대한 소스 코드를 보면String클래스, 실제로 호출된다.Integer.toString()가 려면을 때valueOf().

자라면,Integer.toString()(아마도, 컴파일 시간에 호출이 최적화되지 않았다면) 조금 더 빠를 것이다.

당신이 보는 것의 구현은 API에 명시된 계약을 충족시키기 위한 가장 간단한 방법이다: "표현은 정확히 하나의 논쟁의 방법에 의해 반환된 것이다."

이 추가 통화로 인해 효율성 문제가 발생할 것을 염려해서는 안 된다.만약 비용이 든다면, 그것은 최소일 것이고, 사물의 더 큰 그림에서는 무시할 수 있을 것이다.

아마도 둘 다 존재하는 이유는 가독성을 제공하기 위해서일 것이다.여러 유형이 변환되는 상황에서String, 그리고 나서 다양한 통화들String.valueOf(SomeType)여러 가지보다 읽을 수 있을 것이다.SomeType.toString전화를 걸다

OPs 질문에 대답하자면, 단순히 다른 전화를 받는 것은 도우미 포장지일 뿐이고, 스타일 선택으로 귀결되고, 그것이 전부다.여기 오보가 많이 있고 자바 개발자가 할 수 있는 최선의 방법은 각 방법에 대한 구현을 보는 것인데, IDE에서는 한 두 번의 클릭 거리밖에 되지 않는다.분명히 알게 될 것이다.String.valueOf(int)그냥 부르는 것이다.Integer.toString(int)너를 위해서.

따라서 둘 다 문자 버퍼(char buffer)를 만들고, 숫자의 숫자를 걸어간 다음, 그것을 새 문자열에 복사하여 반환한다는 점에서 절대적으로 차이가 없다(따라서 각각 하나의 문자열 객체를 만들고 있다).차이점만 있다면, 컴파일러가 전화 한 통에 대해 삭제하는 추가 통화 한 통뿐입니다.

그래서 당신이 어떤 것을 부르든 상관없어 코드-컨센서스 말고는null에 대한 코멘트에 대해서는, 원시적인 것이 필요하므로 null이 될 수 없다!전달되는 인트를 초기화하지 않으면 컴파일 시간 오류가 발생할 것이다.따라서 이 경우에는 존재하지 않는 null을 처리하는 방법에는 차이가 없다.

나의 openion은 () 항상 tostring()을 나타내는 값이고, 그래서 primtive type value의 rpresenta는 일반화된다.그리고 기본적으로 java는 데이터 유형을 지원하지 않지만 그것의 작업을 정의하고 그것의 모든 것을 cllas와 made object로 분류한다.여기 Integent.toString(int i)는 정수에 대해서만 변환을 만든다.

Integr.toString(5)과 String.valueOf(5) 사이에는 차이가 없다.

문자열.valueOf가 반환되기 때문에:

public static String valueOf(int i) {
    return Integer.toString(i);
}
public static String valueOf(float f) {
    return Float.toString(f);
}

등등..

String.valueOf() 메소드를 사용하면 데이터(int, long,char,char,char[],boolean,Object 등)에 대해 걱정하지 않아도 된다.

  • 정적 문자열 값Of()

유일한 구문인 String.valueOf()를 사용하여 매개 변수로 전달되는 모든 것을 String으로 변환하고 반환할 수 있다.

그렇지 않으면 Integr.toString(),Float.toString() 등을 사용할 경우(예: SomeType.toString()) 문자열로 변환하려는 파라미터의 데이터 유형을 확인해야 한다.따라서 이러한 변환에는 String.valueOf()를 사용하는 것이 좋다.

정수, Char, Float 등과 같은 다른 값을 포함하는 객체 클래스의 배열이 있는 경우 String.valueOf() 방법을 사용하여 해당 배열의 요소를 문자열 형식으로 쉽게 변환할 수 있다.반대로 SomeType.toString()을 사용하려면 처음에는 데이터 유형 클래스에 대해 알아야 하며(아마도 "InstanceOf" 연산자를 사용하여) 그 다음 사용자만 유형캐스트를 진행할 수 있다.

String.valueOf() 메서드는 호출될 때 전달된 매개 변수(정수, Char, Float 등)와 일치하고 메서드를 오버로드하여 "valueOf()" 메서드가 일치하는 메서드를 호출한 다음, 그 메서드 내부에서는 해당 "toString()" 메서드에 대한 직접 호출이다.

따라서 데이터 유형을 확인한 후 해당 "toString()" 방법을 호출하는 오버헤드가 어떻게 제거되는지 알 수 있다.우리에게 필요한 것은 String.valueOf() 메서드를 우리가 String으로 변환하고 싶은 것에 신경쓰지 말고 호출하는 것이다.

결론:String.valueOf() 메서드는 통화 한 번만 더 하면 그 중요성이 있다.

참조URL: https://stackoverflow.com/questions/3335737/integer-tostringint-i-vs-string-valueofint-i

반응형