itsource

Java: 정수는 vs.==

mycopycode 2022. 11. 26. 14:01
반응형

Java: 정수는 vs.==

Java 1.5 이후로는 대부분의 교환이 가능합니다.Integer와 함께int많은 상황에서.

하지만, 나는 내 코드에 조금 놀랐던 잠재적인 결함을 발견했다.

다음 코드:

Integer cdiCt = ...;
Integer cdsCt = ...;
...
if (cdiCt != null && cdsCt != null && cdiCt != cdsCt)
    mismatch = true;

값이 같으면 미스매치를 잘못 설정하고 있는 것 같습니다만, 어떤 상황에서는 판단할 수 없습니다.이클립스에 브레이크포인트를 설정했는데Integer값은 둘 다 137이었고, 부울식을 검사했더니 false라고 되어 있었는데, 그것을 넘어섰을 때 불일치가 true로 설정되어 있었습니다.

조건 변경:

if (cdiCt != null && cdsCt != null && !cdiCt.equals(cdsCt))

문제를 해결했습니다.

왜 이런 일이 일어났는지 누가 좀 밝혀줄 수 있나요?지금까지 로컬호스트의 동작은 자신의 PC에서만 볼 수 있었습니다.이 경우 코드는 약 20회 비교를 통과했지만 2회에서는 실패했습니다.그 문제는 일관되게 재현할 수 있었다.

일반적인 문제일 경우 다른 환경(개발 및 테스트)에서 오류가 발생할 수 있지만, 지금까지 이 코드 스니펫을 수백 번 테스트한 결과 문제를 보고한 사람은 없습니다.

여전히 합법적이지 않은가?==비교하다Integer가치관?

다음 stackoverflow 링크에는 아래의 모든 상세한 답변 외에 많은 추가 정보가 포함되어 있습니다.원래 질문에는 답변이 되었지만, 질문에는 오토박스를 언급하지 않았기 때문에 선택된 제안에는 표시되지 않았습니다.

컴파일러/JVM이 자동 박스를 "그냥 작동"시킬 수 없는 이유는 무엇입니까?

JVM이 Integer 값을 캐시하고 있습니다.따라서 와의 비교==-128에서 127 사이의 숫자에서만 작동합니다.

참조: #Immbuable_Objects_2F_Wrapper_Class_Caching

둘 다 비교가 안 된다Integer간단한 방법으로==그것들은 물체이기 때문에 대부분의 경우 동일하지 않을 것입니다.

요령이 있다Integer-128에서 127 사이의 참조는 자동 박스에서 사용하는 것과 동일합니다.Integer.valueOf()작은 정수를 캐시합니다.

박스화 되는 값 p가 true, false, 바이트, \u0000 ~\u007f 의 char, 또는 -128 ~127 의 int 또는 쇼트 번호의 경우, r1 및 r2 는 p 의 2 개의 박스화 변환의 결과라고 합니다.r1 == r2인 경우는 항상 있습니다.


자원:

같은 토픽에 대해서:

"=="는 항상 값의 메모리 위치 또는 개체 참조를 비교합니다.equals 메서드는 항상 값을 비교합니다.그러나 Equals는 값을 비교하는 데 "==" 연산자를 간접적으로 사용하기도 합니다.

Integer는 Integer 캐시를 사용하여 -128 ~ +127의 값을 저장합니다.-128 ~ 127 사이의 값을 확인하는 데 == 연산자를 사용하면 true를 반환합니다.이러한 값을 제외하고 false를 반환합니다.

자세한 내용은 링크를 참조하십시오.

Integer참조를 비교할 때 값이 아닌 동일한 개체를 가리킬 경우 참조를 참조합니다.따라서 문제가 발생하고 있습니다.와 잘 int타입은, 에 의해서 포함되는 값을 언박스로 하는 것입니다.Integer.

하고 있는 이라면, 왜, 「」, 「」, 「」, 「」를 가지고 있는 것입니까.if저저진 술술 ?? ???

mismatch = ( cdiCt != null && cdsCt != null && !cdiCt.equals( cdsCt ) );

정수로 하다.값이 아닌 두 개체 참조를 비교하기 때문에 일치하지 않습니다. 론. 뻔. obviously. obviously..equals오브젝트 참조 비교가 아닌 값을 비교하기 위해 덮어씁니다.

이 훌륭한 답변 외에 제가 배운 것은 다음과 같습니다.

참조로 비교할 생각이 아니라면 ==와 개체를 비교하지 마십시오.

, 사용의 도.== 비교한 중 됩니다.Integer 전 값==다음과 같이 합니다.

if ( firstInteger.intValue() == secondInteger ) {..

는 자동).null를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/3637936/java-integer-equals-vs

반응형