programing

Java의 Integer.toString(inti) vs String.valueOf(inti)

goodsources 2023. 8. 9. 20:43
반응형

Java의 Integer.toString(inti) vs String.valueOf(inti)

나는 왜 그 방법인지 궁금합니다.String.valueOf(int i)존재합니까?이 방법을 사용하여 변환 중입니다.int안으로String그리고 방금 발견했습니다.Integer.toString(int i)방법.

이러한 방법의 구현을 살펴본 후 첫 번째 방법이 두 번째 방법을 호출하는 것임을 알게 되었습니다.결과적으로 나의 모든 전화는String.valueOf(int i) 전화하는 보다 한 번 더해야 합니다.Integer.toString(int i)

String type에는 몇 가지 메서드 값이 있습니다.

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)

등등

것은 , 이 더 합니다.valueOfString 클래스보다 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과는 반대로 두 가지 변경을 해야 합니다.

▁the하는은.valueOfString 클래스의 메서드가 더 유연하기 때문에 이 클래스에서 사용할 수 있습니다.

한 가지 큰 차이점은 만약 당신이 이 사건을toString()null 객체에서 다음을 얻을 수 있습니다.NullPointerException에 면에, 용사를 사용합니다String.valueOf()null을 할 수 .

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

String 클래스는 모든 기본 유형 및 Object 유형에 대해 valueOf 메서드를 제공하므로 하나의 클래스를 통해 모두 액세스할 수 있는 편리한 메서드라고 생각합니다.

NB 프로파일링 결과

평균 intToString = 5368ms, 평균 문자열 값 Of = 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에 지정된 계약을 충족하는 가장 간단한 방법입니다. "표현은 정확히 하나의 인수 방법으로 반환되는 것입니다."

OPS 질문에 답하기 위해, 다른 전화를 받는 것은 도우미 래퍼일 뿐이며, 스타일 선택으로 귀결됩니다.여기에는 많은 잘못된 정보가 있으며 Java 개발자가 할 수 있는 최선의 방법은 각 방법에 대한 구현을 살펴보는 것입니다. IDE에서 한 번 또는 두 번 클릭할 수 있습니다.은 그것을 분명히 볼 수 있을 것입니다.String.valueOf(int)단순히 부르는 것입니다.Integer.toString(int)널 위해서.

따라서 둘 다 문자 버퍼를 만들고 숫자의 숫자를 거친 다음 새 문자열로 복사하여 반환한다는 점에서 전혀 차이가 없습니다(따라서 각각 하나의 문자열 개체를 만듭니다).유일한 차이점은 컴파일러가 한 번의 호출로 제거하는 추가 호출입니다.

그래서 코드 일관성 외에는 어떤 것을 부르든 중요하지 않습니다.null에 대한 주석에 대해서는 원시적인 것이 필요하므로 null일 수 없습니다!전달 중인 int를 초기화하지 않으면 컴파일 시간 오류가 발생합니다.따라서 이 경우에는 존재하지 않기 때문에 null을 처리하는 방법에 차이가 없습니다.

이 추가 통화로 인해 효율성 문제가 발생할 수 있다는 걱정은 하지 않으셔도 됩니다.만약 비용이 든다면, 그것은 최소가 될 것이고, 사물의 더 큰 그림에서 무시할 수 있을 것입니다.

아마도 둘 다 존재하는 이유는 가독성을 제공하기 위해서일 것입니다.많은 유형이 다음으로 변환되는 상황에서String그 다음에 다양한 전화가 옵니다.String.valueOf(SomeType)다양한 것보다 더 읽을 수 있습니다.SomeType.toString전화가 걸려오는 전화.

나의 openion은 표현을 위해 항상 string()에 호출되는 값이며 따라서 primitive type 값의 표현은 일반화됩니다. 그리고 java는 기본적으로 Data type을 지원하지 않지만 모든 것을 clas와 made object로 작업을 정의하고 클래스를 지정합니다. 여기서 Integer.to String(inti)은 정수에 대한 제한을 만듭니다.

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

String.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[], boolean, Object)에 대해 걱정할 필요가 없습니다.

  • 정적 문자열 값Of()

유일한 구문 String.valueOf()를 사용하면 매개 변수로 전달한 모든 항목이 String으로 변환되어 반환됩니다.

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

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

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

따라서 데이터 유형을 확인한 다음 해당 "toString()" 메서드를 호출하는 오버헤드가 어떻게 제거되는지 확인할 수 있습니다.String.valueOf() 메서드를 호출하기만 하면 됩니다. String으로 변환할 내용은 상관 없습니다.

결론:String.valueOf() 메서드는 호출을 한 번 더 하는 것만으로도 중요합니다.

언급URL : https://stackoverflow.com/questions/3335737/integer-tostringint-i-vs-string-valueofint-i-in-java

반응형