문제

이 코드를 고려하십시오.

class test {
   public static void main(String[] args) {
      test inst_test = new test();
      int i1 = 2000;
      int i2 = 2000;
      int i3 = 2;
      int i4 = 2;
      Integer Ithree = new Integer(2); // 1
      Integer Ifour = new Integer(2); // 2
      System.out.println( Ithree == Ifour );
      inst_test.method( i3 , i4 );
      inst_test.method( i1 , i2 );
   }
   public void method( Integer i , Integer eye ) {
      System.out.println(i == eye );
   }
}

인쇄 :

false
true
false

나는 첫 번째를 이해한다 false, == 연산자는 두 개의 참조가 동일한 객체에 대해 작동하는지 확인합니다.이 경우에는 그렇지 않습니다.

다음과 같은 true 그리고 false 내 머리를 긁어주세요. Java는 왜 고려할 것입니다 i3 그리고 i4 동일하지만 i1 그리고 i2 다른? 둘 다 정수에 싸여있어서는 안됩니다 둘 다 거짓으로 평가 하시겠습니까? 이 불일치에 대한 실질적인 이유가 있습니까?

도움이 되었습니까?

해결책

객체로의 프리미티브를 autoboxing (호출에 사용하는대로 method 작은 값의 캐시를 사용합니다. 로부터 Java 언어 사양 섹션 5.1.7:

박스형 값이 true, false, a byte, char u0000 ~ u007f의 숯, 또는 -128과 127 사이의 int 또는 짧은 숫자 인 경우, R1과 R2는 두 권투 변환의 결과가되도록하십시오. p. R1 == R2는 항상 그렇습니다.

다음 사양의 논의 부분은 그 바로 그 부분도 흥미 롭습니다. 특히 JVM은 캐시 할 수 있습니다 원하는 경우 가치 - 결과를 확신 할 수 없습니다.

Integer i1 = 129;
Integer i2 = 129;
boolean b = (i1 == i2);

다른 팁

자가 옥싱시 -128에서 127 사이의 정수가 캐시되고 동일한 래퍼 객체가 반환됩니다. 부울 값과 u0000과 u007f 사이의 숯 값과 동일합니다.

이것은 대부분의 시간을 얻는 것이지만 JVM 구현에 따라 다릅니다.

권투는 정수를 특정 값 (128, 내 생각)보다 미리 구성된 객체와 새로운 객체에 대한 더 높은 값을 언급하기 때문입니다.

오토 옥싱 사용 integer.valueof (i), 클래스 정수의 대상을 구성하는 새로운 정수 (I)가 아닙니다.

다른 사람들이 말했듯이, Valueof ()는 주로 공간 효율을 위해 캐시를 사용합니다.

참조 유형에서 사용하지 마십시오. 거의 항상 실수입니다.

정수 클래스에는 자주 사용되는 인스턴스의 캐시가 포함되어 있습니다. 값의 범위는 일반적으로 JVM에서 JVM에 따라 다르지만 (때로는 구성 가능) 일반적으로 관련 코드는 다음과 같습니다.

public static Integer valueOf(int i) {
    if(i >= -128 && i <= IntegerCache.high)
        return IntegerCache.cache[i + 128];
    else
        return new Integer(i);
}

(Sun JDK 1.6의 코드)

이것은 문자열 인턴과 같습니다. 둘 다 메모리를 저장하고 참조를 사용하여 테스트 평등을 허용하기 때문입니다 (예 : == 대신에 동등합니다)

래핑은 정수 객체의 수를 최소화하려고 시도하고 메모리를 너무 저장하는 2를 나타내는 객체 하나만 생성한다고 생각합니다.

어떤 일이 일어나는지 알지 못하는 물체에서 절대 사용하지 않는 것을 기억하십시오.

오토 옥싱은 일부 캐싱 메커니즘을 사용합니다. 보통 당신은 절대로 의지해서는 안됩니다 ==, 항상 사용하십시오 equals 평등을 확인합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top