==와 Integer.valueOf(String)의 비교 결과가 127과 128에 대해 다른 이유는 무엇입니까?
이러한 코드 행이 다른 값을 반환하는 이유를 알 수 없습니다.
System.out.println(Integer.valueOf("127")==Integer.valueOf("127"));
System.out.println(Integer.valueOf("128")==Integer.valueOf("128"));
System.out.println(Integer.parseInt("128")==Integer.valueOf("128"));
출력은 다음과 같습니다.
true
false
true
번째 이 반환되는 입니까?true
두 가 반환됩니다.false
게 127
★★★★★★★★★★★★★★★★★」128
알고 )127
< >128
. )
세 입니까?true
나는 이 질문에 대한 답을 읽었지만, 어떻게 그것이 돌아올 수 있는지 아직도 모르겠다.true
가 반환되는false
.
여기에는 현저한 차이가 있습니다.
valueOf
.Integer
오브젝트: -128 ~127 사이의 값을 캐시할 수 있습니다.이 첫 이 반환되는 입니다.true
두 값은 -캐시되어 있습니다.-캐시되어 있습니다캐시되어 있습니다.false
값이 에 128은 캐시된 값이 아니기 때문에 두 의 분리된 값이 .Integer
인스턴스.
참조를 비교하고 있는 것이 중요합니다.Integer#valueOf
캐시가 지원하는 값보다 큰 값을 비교할 경우 캐시는 다음과 같이 평가하지 않습니다.true
지점에 비록 통화 속성 값이 등가(사건:해석된값이동일한 경우에도 마찬가지입니다(대소문자:.Integer.valueOf(128) == Integer.valueOf(128)
)를 사용해야 합니다.equals()
대신.대신.
parseInt
원시 원시인을돌려보내고 있다 돌아옵니다.int
왜 세번째 값을 반환하 이것이 세반환되는 이유입니다 값이 번째 있다.true
--128 == 128
, 그리고물론 평가되고 있습니다의 평가됩니다.true
.
이제, 공정한 그 세번째 결과 자, 그 세 번째 결과는 꽤 많이 발생하게 됩니다를 만들게 되었다.true
:
사용 중인 동등 연산자 및 데이터 유형에 대해 다음과 같은 언박싱 변환이 발생합니다.
int
★★★★★★★★★★★★★★★★★」Integer
. 당신은...을얻을 수 있습니다.Integer
부터에서valueOf
물론 오른쪽에 있습니다.두 개의 인 것을 하고 있습니다.
int
. 것에 에 결국 비교하게 .128
★★★★★★★★★★★★★★★★★」128
.
Integer
의 특별한 256개의 캐시가 되어 있는 Integer
- 199 사이의 : -128~는 1개입니다.이 점을 염두에 두고 이 세 가지 차이점을 고려해 보십시오.
new Integer(123);
것이 .Integer
★★★★★★ 。
Integer.parseInt("123");
" " 가 됩니다.int
String
.
Integer.valueOf("123");
이것은 다른 것보다 더 복잡하다. ''부터 시작합니다.String
그런 다음 값이 -128 ~127이면 정적 캐시에서 대응하는 개체를 반환합니다.이 이이 값이 됩니다.new Integer()
새 개체를 얻을 수 있도록 값을 전달합니다.
자, 그럼 이 세 가지 표현을 생각해 보세요.
Integer.valueOf("127")==Integer.valueOf("127");
은 참이기 참이 된다.왜냐하면Integer
이 값은 127 이며, 스태틱캐시에서2회 취득되어 자신과 비교됩니다.밖에 없다Integer
가 관련되어 있기 은 「이러한 것은 아니다」, 「이러한 것은 아니다」를 반환합니다.true
.
Integer.valueOf("128")==Integer.valueOf("128");
값은 반환됩니다.false
하지 않기 입니다.128은스태틱캐시에 존재하지 않습니다. 새로운 ★★★★★★★★★★★★★★★★★★★★★.Integer
평등의 각 측면을 위해 만들어진 것입니다. 다른 것이 Integer
및 「」를 참조해 주세요.==
" " " 만이 반환됩니다.true
오브젝트일 , 은 「」가 .false
.
Integer.parseInt("128")==Integer.valueOf("128");
입니다.int
이 있고 된 값 128이 .Integer
비교가 안 에 비교가 안 .int
Integer
는, Java 의 자동 합니다.Integer
.int
int
에 이 을 반환합니다.true
.
이러한 메서드에서 반환되는 값에 주의하십시오.valueOf 메서드는 Integer 인스턴스를 반환합니다.
public static Integer valueOf(int i)
해석Int 메서드는 정수 값(기본 형식)을 반환합니다.
public static int parseInt(String s) throws NumberFormatException
비교 설명:
메모리를 절약하기 위해 래퍼 개체의 두 인스턴스는 원시 값이 같을 때 항상 ==가 됩니다.
- 부울
- 바이트
- \u0000 ~\u007f의 문자(7f는 10진수 127입니다)
- -128 ~ 127의 짧은 정수
==를 사용하여 래퍼를 래퍼와 비교하면 래퍼가 래핑 해제되고 비교가 원시와 비교됩니다.
고객님의 경우(위 규칙에 따라):
Integer.valueOf("127")==Integer.valueOf("127")
~ 사이의 되어 있기 에 같은 를 비교합니다. -128은 127로 반환됩니다.true
.
Integer.valueOf("128")==Integer.valueOf("128")
에 없는 하고 있기 에 서로 와 비교합니다.는 <-128, 127>을 반환합니다.false
.
Integer.parseInt("128")==Integer.valueOf("128")
이 랩 됩니다.true
정수 개체는 -128에서 127 사이의 256 정수 캐시
개체 참조를 == 또는 !=와 비교해서는 안 됩니다.대신 .equals(..)를 사용하거나 정수 대신 원시 int를 사용하십시오.
parseInt: 문자열 인수를 부호 있는 10진수 정수로 해석합니다.문자열의 문자는 모두 10진수여야 합니다.단, 첫 번째 문자는 음의 값을 나타내기 위해 ASCII 마이너스 기호 '-'(\u002D)일 수 있습니다.인수와 기수 10이 parseInt(java.lang)에 인수로 지정된 것과 동일하게 결과 정수 값이 반환됩니다.String, int) 메서드.
valueOf 두 번째 인수로 지정된 기수와 구문 분석할 때 지정된 문자열에서 추출된 값을 유지하는 정수 개체를 반환합니다.첫 번째 인수는 parseInt(java.lang)에 인수가 주어진 것과 마찬가지로 두 번째 인수에 의해 지정된 기수 내의 부호 있는 정수를 나타내는 것으로 해석됩니다.String, int) 메서드.그 결과 문자열로 지정된 정수 값을 나타내는 Integer 객체가 생성됩니다.
에 상당하는
new Integer(Integer.parseInt(s, radix))
radix - 를 해석하는 데 사용되는 기수
만약 당신이 동등하다면Integer.valueOf()
" " " 의 정수에
-128 ~ 127 이 반환되는 조건에서는 true 입니다.
★★★★★★에lesser than
및 -128 °Cgreater than
은 127을 제공합니다.false
주어진 답변을 보완하기 위해 다음 사항에 유의하십시오.
public class Test {
public static void main(String... args) {
Integer a = new Integer(129);
Integer b = new Integer(129);
System.out.println(a == b);
}
}
됩니다.false
사용자 Jay가 승인 답변에 대한 코멘트를 요청했으므로 오퍼레이터를 사용할 때 주의해야 합니다.==
개체에서는 두 참조가 동일한지 여부를 확인합니다. 두 참조는 동일한 값을 나타내지만 서로 다른 Objet이기 때문에 동일하지 않습니다.하려면 , 「」를 합니다.equals
「이것들」은 다음과 같습니다.
Integer a = new Integer(128);
Integer b = new Integer(128);
System.out.println(a.equals(b));
과 같이 인쇄됩니다.true
당신은 물을 수 있지만, 그렇다면 왜 첫 번째 행이 인쇄되었습니까?의 소스 코드 확인Integer.valueOf
수 .
public static Integer valueOf(String s) throws NumberFormatException {
return Integer.valueOf(parseInt(s, 10));
}
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
매개 변수가 다음 사이의 정수인 경우IntegerCache.low
및 (-)IntegerCache.high
(최소값 127로 런타임에 변환됨) 그러면 사전 변환(예측) 개체가 반환됩니다. 오브젝트에 되어 127이 됩니다.true
참고 문헌을 비교한 결과입니다.
언급URL : https://stackoverflow.com/questions/20877086/why-do-comparisons-with-integer-valueofstring-give-different-results-for-12
'programing' 카테고리의 다른 글
부호 없는 데이터 유형은 무엇입니까? (0) | 2022.08.01 |
---|---|
VueJs 라디오 버튼을 통한 심플한 토굴링 (0) | 2022.08.01 |
GCC의 C/C++ 소스에서 어셈블러 출력을 얻는 방법은 무엇입니까? (0) | 2022.08.01 |
C에 문자열 배열을 작성하려면 어떻게 해야 하나요? (0) | 2022.07.31 |
컴포넌트에서 메인인스턴스 usint $emit 또는 vuex로 이벤트를 내보내는 방법 (0) | 2022.07.31 |