programing

==와 Integer.valueOf(String)의 비교 결과가 127과 128에 대해 다른 이유는 무엇입니까?

newsource 2022. 8. 1. 22:49

==와 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 두 가 반환됩니다.false127 ★★★★★★★★★★★★★★★★★」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