Java에서 parseInt ()와 valueOf ()가 다른가요?


443

parseInt()와는 어떻게 다른 valueOf()가요?

그들은 나에게 정확히 같은 일을 할 것으로 보인다 (도 간다 parseFloat(), parseDouble(), parseLong()등, 그들은 어떻게 다르다 Long.valueOf(string)?

또한, 이들 중 어느 것이 바람직하고 관례 적으로 더 자주 사용됩니까?

답변:


411

에 대한 API Integer.valueOf(String)는 실제로 String에 주어진 것처럼 정확하게 해석 된다고 말합니다 Integer.parseInt(String). 그러나 valueOf(String)반환 반면 객체 반환 원시적를 .new Integer()parseInt(String)int

의 캐싱 이점을 즐기고 싶다면 다음과 Integer.valueOf(int)같은 눈 가리기를 사용할 수도 있습니다.

Integer k = Integer.valueOf(Integer.parseInt("123"))

이제, 당신이 원하는 것은 객체가 아닌 경우 원시, 다음 사용 valueOf(String)에서 새로운 객체를 만드는 것보다 더 매력적 수 있습니다 parseInt(String)전자가 일관되게 존재하기 때문에 Integer, Long, Double, 등


8
두 접근 방식간에 성능 또는 메모리 차이가 있습니까?
로건

90
Integer.valueOf(Integer.parseInt("123"))낭비되는 사이클과 프로그램 크기를 넘어서 Integer.valueOf("123")거나 이점을 얻지 못합니다 Integer.valueOf(123).
Thomas Eding

9
valueOf에 의해 할당 된 새로운 객체 (잠재적으로)는 오버 헤드 (오브젝트, 처리, GC 메모리)를 제공하지만 일반 int는 매우 "경량"입니다. (가장 일반적인 값의 경우 기존 객체에 대한 참조를 얻을 수 있습니다.
foo

14
Integer.valueOf(String)와 정확히 동일한 캐싱을 수행 Integer.valueOf(int)합니다. 실제로 다음과 같이 구현됩니다 Integer.valueOf(Integer.parseInt(…)).
Holger

11
@Khez 프리미티브를 리턴하는 것은 불가능하다 int. 서명은을 반환한다고 말하며 그것이 Integer바로 그 일입니다. 이 대답은 'new'를 반환한다고 말하면 부분적으로 올바르지 않습니다 Integer. 그것은 Javadoc에서 말하는 것이 아닙니다. 캐시 된을 반환 할 수 Integer있습니다.
Lorne의 후작

73

에서 이 포럼 :

parseInt()기본 정수 유형 ( int )을 valueOf리턴 하여 정수를 나타내는 객체 인 java.lang.Integer를 리턴합니다 . 기본 유형 대신 Integer 객체를 원하는 경우가 있습니다.

물론 또 다른 명백한 차이점은 intValueparseInt 가 정적 메서드 인 인스턴스 메서드 라는 것입니다.


9
언급 할만한 가치 : valueOf 버전은 내부 참조 풀을 사용하여 동일한 내부 값을 가진 다른 인스턴스뿐만 아니라 주어진 값에 대한 SAME 객체를 반환합니다. 이것은 두 개의 Longs가 이런 식으로 반환되면 a.equals (b) == true이고 a == b는 true입니다
basszero

아래로 더 입증 된 것처럼, 당신은 String 버전에 맞습니다. 나는 기본 버전을 생각하고있었습니다. Long.valueOf (5)는 항상 같은 객체를 반환합니다. 문자열 버전은 새 객체를 반환하고, 기본 버전은 동일한 객체를 반환합니다.
basszero

1
@bassezero. 또한 해당 풀에는 제한이 있습니다. -127 ~ 127 인 것 같습니다.
OscarRyz

1
참조 풀의 크기는 구현 세부 사항의 실제 예입니다. 패치 릴리스에서는 크기가 커질 수도 있으므로 어떤 것도 의존 해서는 안됩니다 .
Donal Fellows

@OscarRyz 실제로 -128 ~ 127입니다. JVM은 캐시에 대해 가장 높은 상한을 설정하는 매개 변수를 제공합니다. 그러나, 당신은 가장 낮은 바운드 다시 정의 할 수 없습니다 stackoverflow.com/questions/29633158/...
장 - 프랑수아 Savard

36
Integer.valueOf(s)

비슷하다

new Integer(Integer.parseInt(s))

차이점은 valueOf()다시 표시 Integer하고, parseInt()다시 표시 int(원시 형). 또한 valueOf()캐시 된 Integer인스턴스를 반환 할 수 있으므로 ==테스트 결과가 간헐적으로 정확 해 보이는 경우 혼동되는 결과가 발생할 수 있습니다 . 오토 박싱 전에 편의성에 차이가있을 수 있지만, Java 1.5 이후에는 문제가되지 않습니다.

또한 Integer.parseInt(s)기본 데이터 유형도 사용할 수 있습니다.


4
valueOf ()는 동일한 인수를 사용하여 연속적인 호출에 대해 동일한 객체를 반환 할 수 있으며 -128에서 127 사이의 인수에 필요합니다. new Integer ()는 항상 새 객체를 만듭니다.
Adam Rosenfield

어느 것이 더 자주 사용됩니까? 어느 것을 가장 사용해야합니까?
Upvote를 클릭하십시오

3
당신은 int를해야하는 경우에는 정수를 필요로하는 경우, 사용 valueOf ()에서는 parseInt ()를 사용
매트 나

@Joan D 실바를 마지막 줄에서, 내가있는 Integer.parseInt (들)에만 반면 Integer.ValueOf (들) 입력 인수로 모두 INT 및 문자열 걸릴 수있는 문자열로 걸릴 수 있다고 생각
Pratik을

14

자바 소스 봐 : valueOf사용이다 parseInt:

/**
 * Parses the specified string as a signed decimal integer value.
 *
 * @param string
 *            the string representation of an integer value.
 * @return an {@code Integer} instance containing the integer value
 *         represented by {@code string}.
 * @throws NumberFormatException
 *             if {@code string} cannot be parsed as an integer value.
 * @see #parseInt(String)
 */
public static Integer valueOf(String string) throws NumberFormatException {
    return valueOf(parseInt(string));
}

parseInt 보고 int

/**
 * Parses the specified string as a signed decimal integer value. The ASCII
 * character \u002d ('-') is recognized as the minus sign.
 *
 * @param string
 *            the string representation of an integer value.
 * @return the primitive integer value represented by {@code string}.
 * @throws NumberFormatException
 *             if {@code string} cannot be parsed as an integer value.
 */
public static int parseInt(String string) throws NumberFormatException {
    return parseInt(string, 10);
}

6

Integer.parseInt는 int를 기본 유형으로 반환 할 수 있습니다.

정수가 사전 할당 된 것 중 하나가 아닌 한 Integer.valueOf는 실제로 Integer 객체를 할당해야 할 수도 있습니다. 이것은 더 많은 비용이 듭니다.

기본 유형 만 필요한 경우 parseInt를 사용하십시오. 객체가 필요한 경우 valueOf를 사용하십시오.

또한 이러한 잠재적 할당으로 인해 오토 박싱이 실제로 모든면에서 좋은 것은 아닙니다. 속도가 느려질 수 있습니다.


1

구문 분석 * 변형은 기본 유형을 반환하고 valueOf 버전은 Object를 반환합니다. valueOf 버전은 내부 참조 풀을 사용하여 동일한 내부 값을 가진 다른 인스턴스뿐만 아니라 주어진 값에 대해 SAME 객체를 반환한다고 생각합니다.


사실, 사실이 아닙니다. 처음에는 그렇게 생각했지만 Integer.valueOf (String)에 대한 Javadocs는 그것이 새로운 Integer (Integer.parseInt (String))와 동일하다는 것을 분명히 밝힙니다. Integer.valueOf (int)는 실제로 캐시를 수행합니다.
Michael Myers

당신은 String 버전에 맞습니다. 나는 기본 버전을 생각하고있었습니다. Long.valueOf (5)는 항상 같은 객체를 반환합니다.
basszero

1

jdk1.5 이상을 사용 중일 수 있으므로 int로 자동 변환됩니다. 따라서 코드에서 첫 번째 정수를 반환 한 다음 int로 자동 변환됩니다.

귀하의 코드는

int abc = new Integer(123);


0

공개 정적 정수 valueOf (String s)

  1. 인수는 마치 parseInt (java.lang.String) 메소드에 제공된 것처럼 부호있는 십진 정수를 나타내는 것으로 해석됩니다.
  2. 결과는 문자열로 지정된 정수 값을 나타내는 Integer 객체입니다.

  3. 즉,이 메소드는 다음 값과 동일한 Integer 오브젝트를 리턴합니다. new Integer (Integer.parseInt (s))


0
  • valueOf- 래퍼 클래스로 변환
  • parseInt- 기본 유형으로 변환

Integer.parseInt는 문자열 만 허용하고 기본 정수 유형 (int)을 리턴합니다.

   public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }

Iteger.valueOf는 int와 String을 받아들입니다. value가 String 인 경우 valueOf는 parseInt를 사용하여 간단한 int로 변환하고 입력이 -128보다 작거나 127보다 큰 경우 새 정수를 반환합니다. 입력이 범위 (-128-127)에 있으면 항상 Integer 객체를 반환합니다. 내부 IntegerCache. Integer 클래스는 내부 정적 IntegerCache 클래스를 유지하여 캐시로 작동하고 정수 객체를 -128에서 127까지 보유하므로 127의 정수 객체를 얻으려고 할 때 항상 동일한 객체를 얻습니다.

Iteger.valueOf(200)처럼입니다 (200)에서 새로운 정수를 줄 것 new Integer(200) Iteger.valueOf(127)과 동일하다 Integer = 127;

문자열을 정수로 변환하지 않으려면을 사용하십시오 Iteger.valueOf.

String을 간단한 int로 변환하지 않으려면 사용하십시오 Integer.parseInt. 더 빨리 작동합니다.

  public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }

  public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
  }

  private static class IntegerCache {
      static final int low = -128;
      static final int high;
      static final Integer cache[];

    static {
        // high value may be configured by property
        int h = 127;
        String integerCacheHighPropValue =
            sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
        if (integerCacheHighPropValue != null) {
            try {
                int i = parseInt(integerCacheHighPropValue);
                i = Math.max(i, 127);
                // Maximum array size is Integer.MAX_VALUE
                h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
            } catch( NumberFormatException nfe) {
                // If the property cannot be parsed into an int, ignore it.
            }
        }
        high = h;

        cache = new Integer[(high - low) + 1];
        int j = low;
        for(int k = 0; k < cache.length; k++)
            cache[k] = new Integer(j++);

        // range [-128, 127] must be interned (JLS7 5.1.7)
        assert IntegerCache.high >= 127;
    }

    private IntegerCache() {}
  }

그리고 Integer.valueOf (127) == Integer.valueOf (127)를 비교하면 true를 반환합니다.

Integer a = 127; // Compiler converts this line to Integer a = Integer.valueOf(127);
Integer b = 127; // Compiler converts this line to Integer b = Integer.valueOf(127);
a == b; // return true 

캐시에서 동일한 참조를 가진 Integer 오브젝트를 가져 오기 때문입니다.

그러나 Integer.valueOf (128) == Integer.valueOf (128)는 false입니다. 128은 IntegerCache 범위를 벗어 났으며 새 Integer를 반환하므로 개체는 다른 참조를 갖습니다.


굵게 표시하지 마십시오. 게시물의 가독성이 떨어집니다.
Zoe

-2
  1. ValueOf->의 경우 Integer 객체를 생성합니다. 기본 유형이 아니며 정적 메소드가 아닙니다.
  2. ParseInt.ParseFloat->의 경우 각 기본 유형을 리턴합니다. 정적 방법입니다.

우리는 필요에 따라 어떤 것을 사용해야합니다. ValueOf의 경우 객체를 인스턴스화하는 중입니다. 텍스트의 가치 만 필요하다면 parseInt, parseFloat 등을 사용해야합니다.

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