Integer.toString (int i) 및 String.valueOf (int i)


176

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

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


답변:


46

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


22
그렇습니다. 그러나 똑같은 일을한다고해서 그것이 같은 것임을 의미하는 것은 아닙니다.
Damian Leszczyński-Vash

3
String.valueOf (int)는 Integer.toString (i)을 직접 호출합니다. Integer.toString (int)를 호출하는 것이 가장 좋습니다.
djchapm

171

문자열 타입에는 여러 가지 메소드 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 클래스 의 메소드를 사용하는 것이 더 유연하므로 거기에서 사용할 수 있습니다.


18
그리고 그것이 10이 아닌 Integer.toString(int i, int radix)다른
Stephen P

@Vash 빈 문자열을 사용하여 int를 String으로 변환하여 String.valueOf와 비교하는 방법에 대해서도 설명해 주시겠습니까? 예) ""+ int i = "i"? 어느 것이 가장 좋습니까?
Kanagavelu Sugumar

1
int를 문자열로 형식화하려면 ""+ i를 사용하지 않아야합니다. 오버 헤드는 크지 않지만 일반적으로 우아하지 않기 때문에 존재합니다. 대신에 사용하는 String.valueOf(int), 당신이 사용할 수있는 String.format("%d",i);이 웹 사이트를 방문하시기 바랍니다 더 읽어 docs.oracle.com/javase/6/docs/api/java/util/Formatter.html을
배쉬 - 데미안 Leszczyński

오토 박스가 더 영리하고 컴파일 또는 무언가에 변환을 추가하기를 바랍니다.
Rob Grant

1
@RobertGrant 오토 박스는 여기에 해당되지 않습니다. 그러나 귀하의 우려에 대답하기 위해, 당신이 이것을 할 수 int i = new Integer("1");있고 그 반대도 영리합니다 .
Damian Leszczyński-Vash

52

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


46
문제는 약 Integer.toString(int i)하는 static방법. null가능한 개체 가 없습니다 .
Petr Janeček

14
Integer i = null; i.toString(); // Null pointer exception!! String.valueOf(i); // No exception
manish_s

10
@Manis Kumar : 예제는 String.valueOf(int i)메소드를 실행하지 않지만 String.valueOf(Object obj). 어쨌든 문제는 int의 가능성이없는 프리미티브 값 에 관한 것입니다 null.
hleinone

1
@manish_s 아무도 Object type Integer에 대해 이야기하고 있지 않다는 예에서 꽤 분명했습니다. 우리는 프리미티브에 대해서만 이야기하고 있습니다.
Daniel Ochoa

2
@manish_s : OP는 말하지 Integer.toString()않았지만 Integer.toString(int i). 정적 방법입니다 ( docs.oracle.com/javase/7/docs/api/java/lang/… ).
LarsH

13

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

7
프로파일 링은 실제로 "웜업"기간을 가져야합니다. 그렇지 않으면 JIT 땜질로 인해 결과가 왜곡 될 수 있습니다. 즉, 10 ^ 8 동작에 대한 300ms 차이는 매우 무시할 정도로 작습니다.
Cameron Skinner

1
@ Kinggo 테스트 사례가 맞지 않다고 생각합니다. 값을 할당 String j하지만 사용하지 않기 때문입니다. 기본 컴파일러가이를 최적화했을 수 있습니다. 다른 방법으로 j 객체를 전달하고 더미 작업을 수행하는 것이 좋습니다.
Rakesh

1
이런 식으로 자란 마이크로 벤치 마크를 작성해서는 안됩니다. 당신이 사용하는 경우 JMH을 . 이 워밍업의 관리, 시간 측정, 여러 independend의 시도를이 (. 다른 방법과 값을 포함 결과 - 실행 칠분)처럼 보이는, 그리고 코드의 작은하게 (! 자바 만들어 낸다) 소요됩니다 : gist.github.com/ecki/를 399136f4fd59c1d110c1 (스포일러 : ""+ n won).
eckes

5
고마워 친구, 그러나 나의 대답은 5 년 전이었다! JMH는 2013 년에만 출시되었습니다 : P
Kingo

9

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가 더 유연합니다.


8

String클래스 의 소스 코드를 보면 실제로 호출 Integer.toString()할 때 호출 valueOf()합니다.

Integer.toString(), 메소드 호출이 컴파일 타임에 최적화되지 않으면 아마도 더 빠를 수 있습니다.


예, ""+ n이 훨씬 빠릅니다.
eckes


2

OPs 질문에 대답하기 위해 다른 호출을하는 도우미 래퍼 일뿐이며 스타일 선택에 달려 있습니다. 여기에 많은 잘못된 정보가 있다고 생각하고 Java 개발자가 할 수있는 가장 좋은 방법은 각 메소드의 구현을 살펴 보는 것입니다. 모든 IDE에서 한두 번의 클릭만으로 가능합니다. 당신은 그것이 String.valueOf(int)단순히 Integer.toString(int)당신을 요구 하고 있음을 분명히 볼 것 입니다 .

따라서 문자 버퍼를 만들고 숫자의 숫자를 밟은 다음 새 문자열에 복사하여 반환합니다 (따라서 각각 하나의 문자열 객체를 생성 함). 차이점은 오직 하나의 추가 호출이며, 컴파일러는 단일 호출을 제거합니다.

따라서 코드 일관성과는 별도로 호출하는 것이 중요하지 않습니다. 널 (null)에 대한 주석과 관련하여 기본 요소를 사용하므로 널 (null) 일 수 없습니다! 전달되는 int를 초기화하지 않으면 컴파일 타임 오류가 발생합니다. 따라서이 경우 존재하지 않기 때문에 null을 처리하는 방법에는 차이가 없습니다.


텍스트를 일부 블록으로 분리 할 수 ​​있습니까? 읽기가 매우 어렵습니다.
Magnilex

이 OP에는 잘못된 정보가 많이 있습니다. 귀하의 게시물이 저에게 가장 적합한 답변입니다! 감사합니다
aksappy

1

효율성 문제로 인한 추가 통화에 대해 걱정하지 않아도됩니다. 비용이 든다면 비용이 최소화되며 더 큰 그림에서는 무시할 수 있어야합니다.

아마도 둘 다 존재하는 이유는 가독성을 제공하는 것입니다. 많은 유형이로 변환되는 상황에서 String다양한 호출 String.valueOf(SomeType)이 다양한 SomeType.toString호출 보다 더 읽기 쉽습니다.


1
실제로 이러한 단선 전화는 매우 빠르게 인라인됩니다.
Tassos Bassoukos

1 000 시간을 호출하는 루프에서도 String.valueof () ??
Manuel Selva

@Manuel : 당신은 그것을 프로파일 했습니까? 여기에 성능 문제가 있음을 식별 했습니까? 조기 최적화하지 않습니까? @Tassos : 그렇습니다. 매우 가능성이 높지만 프로파일 링에서이 특정 호출에 문제가 있다고 말하지 않으면 걱정하지 않아도됩니다.
유성 윤활제

실제로, Manuel, 루프는 한 번 또는 두 번가는 것보다 1000000 번 반복되는 루프가 더 자주 인라인 될 것으로 예상합니다. 그럼에도 불구하고 반복 횟수에 관계없이 시간의 작은 부분이 될 것입니다.
corsiKa

아니요.하지만 내 응용 프로그램에 병목이 없다고 확신합니다. 나는 여기서 가독성 문제를 볼 수 없기 때문에 이것을 묻는 것이므로 이득이 0 인 경우에도 더 최적의 코드를 사용해야한다고 생각합니다. 동의하지 않습니까?
마누엘 셀바

1

내 오픈은 valueof ()는 항상 toa (()을 대표하기 위해 tostring ()이라고 부릅니다. object .here Integer.toString (int i) 정수만 변환하는 한계를 만듭니다.


1

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

기타..


0

String.valueOf () 메소드를 사용하면 데이터에 대해 걱정할 필요가 없습니다 (int, long, char, char [], boolean, Object) : 그냥 호출 할 수 있습니다 :

  • 정적 문자열 valueOf ()

유일한 구문을 사용하면 String.valueOf () 매개 변수로 전달하는 모든 것이 String으로 변환되어 반환 될 수 있습니다.

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

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

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

따라서 데이터 유형을 확인한 다음 해당 "toString ()"메서드를 호출하는 오버 헤드가 제거되는 방법을 확인할 수 있습니다. String으로 변환 할 대상에 신경 쓰지 않고 String.valueOf () 메서드 만 호출하면됩니다.

결론 : String.valueOf () 메소드는 한 번의 추가 호출 비용으로 중요합니다.


-3

toString ()

  1. 일반적으로 파생 클래스에서 재정의되는 Object 클래스에 있습니다.
  2. toString () 메소드를 호출하려면 적절한 클래스에 대한 유형 캐스트가 필요합니다.

valueOf ()

  1. String 클래스에 오버로드 된 정적 메서드가 있습니다.
  2. 기본 유형과 객체 유형을 처리합니다.

    Integer a = null;
    System.out.println(Integer.toString()) ; NUll pointer exception
    System.out.println(String.valueOf() ; give NULL as value

이 링크가 아주 좋은지 확인하십시오. http://code4reference.com/2013/06/which-one-is-better-valueof-or-tostring/

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.