Integer.toString (int i) 및 String.valueOf (int i) i)방법. 이 메소드의 구현을 살펴본 후 첫 번째

왜 방법 String.valueOf(int i)이 존재 하는지 궁금 합니다. 나는 변환하려면이 방법을 사용하고 있습니다 intString그냥 발견 Integer.toString(int i)방법.

이 메소드의 구현을 살펴본 후 첫 번째 메소드가 두 번째 메소드를 호출하는 것을 보았습니다. 결과적으로 String.valueOf(int i)직접 전화하는 것보다 하나 이상의 전화 를 포함하는 모든 전화Integer.toString(int i)



답변

똑같은 일을하는 두 가지 다른 방법. 역사적인 이유 일 수 있습니다 (하나가 다른 것보다 먼저 왔는지 기억할 수 없음).


답변

문자열 타입에는 여러 가지 메소드 valueOf가 있습니다.

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)

더블

Double.toString(double d)

등등

제 생각에는 이것은 역사적인 일이 아니지만 개발자가 valueOf변경 사항이 적기 때문에 개발자가 올바른 유형보다 String 클래스 의 메소드를 사용하는 것이 더 유용합니다 .

샘플 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으로 String 클래스 의 메소드를 사용하는 것이 더 유연하므로 거기에서 사용할 수 있습니다.


답변

한 가지 큰 차이점은 toString()null 객체 를 호출 하면 null을 얻지 못하는 NullPointerException반면에 null을 얻는다는 것 String.valueOf()입니다.


답변

String 클래스는 모든 기본 유형과 객체 유형에 valueOf 메소드를 제공하므로 하나의 클래스를 통해 모두 액세스 할 수있는 편리한 메소드라고 가정합니다.

NB 프로파일 링 결과

평균 intToString = 5368ms, 평균 stringValueOf = 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(), 메소드 호출이 컴파일 타임에 최적화되지 않으면 아마도 더 빠를 수 있습니다.


답변

이 구현은 String.valueOf()API에 지정된 계약을 충족하는 가장 간단한 방법입니다. “표현은 정확히 Integer.toString()하나의 인수 의 메소드에 의해 리턴 된 것 입니다.”