development

Java에서 parseInt와 valueOf의 차이점은 무엇입니까?

big-blog 2020. 2. 20. 23:33
반응형

Java에서 parseInt와 valueOf의 차이점은 무엇입니까?


이 두 방법의 차이점은 무엇입니까? 그들은 나에게 정확히 같은 일을 할 것으로 보인다 (도 간다 parseFloat(), parseDouble(), parseLong()등, 그들은 어떻게 다르다 Long.valueOf(string)?

편집 : 또한, 이것들 중 어느 것이 바람직하고 규칙에 의해 더 자주 사용됩니까?


글쎄,에 대한 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, 등


에서 이 포럼 :

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

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


Integer.valueOf(s)

~와 비슷하다

new Integer(Integer.parseInt(s))

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

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


자바 소스 봐 : 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);
}

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

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

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

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


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

귀하의 코드는

int abc = new Integer(123);

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


valueOf가 새로운 Integer 객체를 반환하기 때문에 아래 코드가 왜 정확합니까?

String base5String = "230";
int result = Integer.valueOf(base5String);

Integer 클래스를 확인하면 해당 parseInt 메소드의 값을 찾을 수 있습니다. 큰 차이점은 valueof API 호출시 캐싱입니다. 값이 -128에서 127 사이 인 경우 캐시합니다. 자세한 정보는 아래 링크를 참조하십시오.

http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html


공개 정적 정수 valueOf (String s)

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

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


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 클래스는 캐시로 작동하고 정수 객체를 -128에서 127까지 보유하는 내부 정적 IntegerCache 클래스를 유지하므로 127에 대한 정수 객체를 얻으려고 할 때 항상 동일한 객체를 얻습니다.

int 200에서 새 Integer를 가져 오지 않으려면 Iteger.valueOf (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를 반환하므로 개체는 다른 참조를 갖습니다.


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

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

참고 URL : https://stackoverflow.com/questions/508665/difference-between-parseint-and-valueof-in-java



반응형