2016-06-21 5 views
0

평등을 검사하는 테스트 코드를 작성했습니다. 나는 자바 문서를 검사했고 BigInteger은 불변이라고 말합니다. 정적 팩토리 메서드 valueOf의 문서를 확인하면 이미 캐시 된 변경 불가능한 인스턴스가 반환됩니다. 그렇다면 캐시 된 인스턴스가있을 때 ==가 false를 반환하는 이유는 무엇입니까?BigInteger.ValueOf()는 캐시 된 객체를 반환합니까?

값 긴 지정된 의와 동일한 큰 정수를 반환

다음은 valueOfBigInteger에 대한 Java 문서입니다. 이 "정적 팩토리 메서드"는 자주 사용되는 BigIntegers를 다시 사용할 수 있으므로 (long) 생성자보다 우선적으로 제공됩니다.

아래 코드는 무한 루프가됩니다.

public static void main(String[] args) { 
    while(true) { 
     BigInteger a = BigInteger.valueOf(100); 
     BigInteger c = BigInteger.valueOf(100); 
     if (a == c) { 
      break; 
     } 
} 
+2

입니다'== 참조 평등을위한'시험, '.equals()'값 동일성 테스트 – azurefrog

+0

'equal()'을 사용하여 동등성을 검사합니다. – Li357

+1

원시 타입의 경우 '=='는 값을 비교하지만 객체의 경우에는 참조를 비교합니다. – Gendarme

답변

2

BigInteger는 기본 변수 인 int 또는 double과 달리 참조 변수입니다. 이것은 int 나 double을 사용하여 "=="를 사용할 수 없다는 것을 의미합니다. 대신 String을 사용할 때와 비슷한 .equals()를 사용해야합니다.

+0

이 경우 두 번째 호출에 의한'valueOf'는 같은 객체에 대한 참조를 반환해야합니다. – Jagger

+0

@Jagger'valueOf'는 어떤 종류의 캐싱 동작도 지정하지 않습니다. 사물을 캐쉬 할 수는 있지만 그것은 결코 의무 사항은 아닙니다. –

+0

@ 루이스 와서 만 그래, 네 말이 맞아. 예를 들어이 BigInteger.valueOf (100L) == BigInteger.valueOf (100L)는'false'를 반환하고이 BigInteger.valueOf (1L) == BigInteger.valueOf (1L)는'true'를 반환합니다. – Jagger

-1

== 실제 내용 대신 참조를 확인합니다. 이런 이유 때문에 ==는 보통 int, float 등과 같은 원시 데이터 타입과 함께 사용됩니다. 변경 불가능은 기존 값을 업데이트 할 때마다 수정되지 않고 새로운 값이 생성된다는 것을 의미합니다. 그래서 당신의 예제에서 두 객체가 모두 물리적으로 같은 객체인데도 참조 값이 다릅니다.

+0

이 답변은 명확하지 않거나 정확하지 않습니다. – ControlAltDel

6

변경할 수 없음은 인스턴스화 후에 값을 변경할 수 없다는 것을 의미합니다.

특히, JVM이 생성하는 각 값의 복사본이 하나만 있는지 확인해야한다는 의미는 아닙니다. 동일한 내부 상태를 갖는 많은 불변 객체를 만들 수 있지만 여전히 다른 객체입니다. ==과 비교하면 false이 반환되고 equals()이면 true이 반환됩니다. BigInteger를의

0

참조 소스 :

이 -MAX_CONSTANT < 발은 < MAX_CONSTANT는, 반환

일정

을 은닉 // 경우와 MAX_CONSTANT 16

관련 문제