답변:
에 대한 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
, 등
Integer.valueOf(Integer.parseInt("123"))
낭비되는 사이클과 프로그램 크기를 넘어서 Integer.valueOf("123")
거나 이점을 얻지 못합니다 Integer.valueOf(123)
.
Integer.valueOf(String)
와 정확히 동일한 캐싱을 수행 Integer.valueOf(int)
합니다. 실제로 다음과 같이 구현됩니다 Integer.valueOf(Integer.parseInt(…))
.
int
. 서명은을 반환한다고 말하며 그것이 Integer
바로 그 일입니다. 이 대답은 'new'를 반환한다고 말하면 부분적으로 올바르지 않습니다 Integer
. 그것은 Javadoc에서 말하는 것이 아닙니다. 캐시 된을 반환 할 수 Integer
있습니다.
에서 이 포럼 :
parseInt()
기본 정수 유형 ( int )을valueOf
리턴 하여 정수를 나타내는 객체 인 java.lang.Integer를 리턴합니다 . 기본 유형 대신 Integer 객체를 원하는 경우가 있습니다.물론 또 다른 명백한 차이점은 intValue 는 parseInt 가 정적 메서드 인 인스턴스 메서드 라는 것입니다.
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);
}
구문 분석 * 변형은 기본 유형을 반환하고 valueOf 버전은 Object를 반환합니다. valueOf 버전은 내부 참조 풀을 사용하여 동일한 내부 값을 가진 다른 인스턴스뿐만 아니라 주어진 값에 대해 SAME 객체를 반환한다고 생각합니다.
Integer 클래스를 확인하면 해당 parseInt 메소드의 값을 찾을 수 있습니다. 가장 큰 차이점은 valueof API 호출시 캐싱입니다. 값이 -128에서 127 사이 인 경우 캐시합니다. 자세한 내용은 아래 링크를 참조하십시오
http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html
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를 반환하므로 개체는 다른 참조를 갖습니다.
우리는 필요에 따라 어떤 것을 사용해야합니다. ValueOf의 경우 객체를 인스턴스화하는 중입니다. 텍스트의 가치 만 필요하다면 parseInt, parseFloat 등을 사용해야합니다.