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
'itsource' 카테고리의 다른 글
검색되지 않은(약속되지 않은) 탐색 잘못된 자격 증명에서 중복된 오류 발생 (0) | 2022.12.04 |
---|---|
JSP : JSTL 태그 (0) | 2022.11.26 |
명령줄에서 실행 중인 PHP 스크립트에 변수 전달 (0) | 2022.11.26 |
다양한 데이터 구조의 시간 복잡도는 어느 정도입니까? (0) | 2022.11.26 |
Python에서 임시 디렉토리를 가져오는 크로스 플랫폼 방법 (0) | 2022.11.26 |