문제

나는 Java로 무언가에 대해 확인하고 싶었습니다. 캐릭터 나 정수 또는 길고 그런 종류의 것들이 있다면, 평등을 사용해야합니까?

문자열에는 각 고유 한 문자열의 인스턴스가 하나만 있다는 보장이 없지만 다른 박스형 유형에 대해서는 확실하지 않습니다.

내 직관은 평등을 사용하는 것이지만, 성능을 낭비하지 않도록하고 싶습니다.

도움이 되었습니까?

해결책

편집 : 사양이 만듭니다 약간 권투 변환을 보장합니다. 에서 섹션 5.1.7:

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

구현 ~할 수 있다 더 큰 수영장을 사용하십시오.

나는 할 것이다 진짜 그래도 그것에 의존하는 코드를 쓰지 마십시오. 실패 할 수 있기 때문에가 아니라 분명하지 않기 때문에 사양을 잘 아는 사람은 거의 없습니다. (이전에는 그것이 구현 의존적이라고 생각했습니다.)

당신은 사용해야합니다 equals 또는 기본 값을 비교하십시오

if (foo.equals(bar))

또는

if (foo.intValue() == bar.intValue())

오토 옥싱이 고정 값을 사용하도록 보장 되더라도 다른 발신자는 항상 별도의 인스턴스를 만들 수 있습니다.

다른 팁

객체의 가치에 대해 비교하려면 사용하십시오. .equals().

조차도 (특히) 그 객체가 원시 래퍼 유형 바이트, 문자, 짧은, 정수, 길고, 플로트, 이중 및 부울 인 경우.

"=="객체의 정체성을 비교하고 당신은 당신이 원하는 것을 매우 드물게 비교할 수 있습니다. 그리고 원시 포장지와 함께 원하는 것을 절대 절대하지 마십시오.

만 사용합니다 == 이 두 시나리오 중 하나에서 :

  1. 비교와 관련된 모든 값은 원시 유형입니다 (바람직하게는 부동 소수점 번호가 아닙니다)
  2. 두 참조가 동일한 개체를 참조하는지 실제로 알고 싶습니다 (여기에는 비교가 포함됩니다. enums, 값이 객체 아이덴티티에 바인딩되기 때문에)
//Quick test
public class Test {
  public static void main(String[] args) {
    System.out.println("Are they equal? "+ (new Long(5) == new Long(5)));
  }
}

산출:

"그들은 평등합니까? 0"

대답:

아니요, 동일하지 않습니다. .equals를 사용하거나 원시 값을 비교해야합니다.

자바 언어 사양 5.1.7:

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

그리고:

논의

이상적으로는 주어진 원시 값 P를 복싱하면 항상 동일한 참조를 산출합니다. 실제로, 이것은 기존 구현 기술을 사용하여 가능하지 않을 수 있습니다. 위의 규칙은 실용적인 타협입니다. 위의 최종 조항은 특정 공통 값이 항상 구별 할 수없는 객체에 박스를 가져와야합니다. 구현은이를 게으르게 또는 열심히 캐시 할 수 있습니다.

다른 값의 경우,이 공식화는 프로그래머 부분의 박스형 값의 신원에 대한 가정을 비활성화합니다. 이를 통해 이러한 참조 중 일부 또는 전부를 공유 할 수는 없습니다.

이를 통해 대부분의 경우, 특히 소규모 장치에서 과도한 성능 벌금을 부과하지 않고 동작이 원하는 동작이 될 것입니다. 예를 들어, 메모리 제한 구현이 적을수록 모든 문자와 반바지, -32k - +32k 범위의 정수와 오랫동안 캐시 할 수 있습니다.

따라서 어떤 경우에는 ==가 효과가있을 것입니다. 다른 많은 사람들에게는 그렇지 않을 것입니다. 인스턴스를 얻는 방법 (일반적으로)을 수여 할 수 없으므로 항상 안전하기 위해 항상 .equals를 사용하십시오.

속도가 요인 인 경우 (대부분의 .equals는 == 비교로 시작하거나 최소한해야합니다), 당신은 그들이 할당 된 방법을 구할 수 있고 위의 범위에 맞는 방법은 안전합니다.

일부 VM은 그 크기를 증가시킬 수 있지만, 실제로 실제로 필요한 경우에도 특정 VM 동작에 의존하는 것보다 Langauge 사양에 의해 지정된 가장 작은 크기를 가정하는 것이 더 안전합니다.

Equals (Object O) 메소드의 구현은 거의 항상 시작합니다.

if(this == o) return true;

그래서 사용 equals 설사 == 사실은 실제로 성능이 큰 히트가 아닙니다.

나는 항상* 사용하는 것이 좋습니다 equals 객체에 대한 방법.

* 물론이 조언을 받아서는 안되는 경우가 거의 없습니다.

일반적인 대답은입니다 아니요, 당신은 동일한 숫자 값에 대해, 당신이 얻는 긴 객체가 동일하다는 것을 보장하지 않습니다 (long.valueof ()를 사용하도록 제한하더라도).

그러나 먼저 참조의 평등 (==)을 테스트 한 다음 실패한 경우 ()를 시도하여 성능 향상을받을 수 있습니다 (). 추가 == 테스트 및 메소드 호출의 비교 비용에 달려 있습니다 ... 마일리지는 다를 수 있지만 간단한 루프 테스트를 시도해 볼 가치가 있습니다.

자동 박스 값은 사용 가능한 경우 풀링 된 객체를 사용한다는 점은 주목할 가치가 있습니다. 이것이 (정수) 0 == (정수) 0이지만 (정수) 128! = (정수) 128의 경우 Java 6U13

결과를 시각적으로보고 싶습니다.

  public static void main(String[] args)
  {
        Integer a = 126; //no boxed up conversion, new object ref
        Integer b = 126; //no boxed up conversion, re-use memory address
        System.out.println("Are they equal? " + (a == b)); // true
        Integer a1 = 140; //boxed up conversion, new object
        Integer b1 = 140; //boxed up conversion, new object
        System.out.println("Are they equal? " + (a1 == b1)); // false
        System.out.println("Are they equal? " + (new Long(5) == new Long(5))); // false
  }

== 객체 참조를 비교합니다 equals(Object obj) 객체 평등에 대한 비교. 존재하는 동등한 대상의 인스턴스가 둘 이상있을 수 있다면 그럼 당신 ~ 해야 하다 사용 equals 평등 비교를 위해.

예 :

Integer i1 = new Integer(12345);
Integer i2 = new Integer(12345);

이것들은 다른 객체 인스턴스이지만 정수의 평등에 따라 동일하므로 사용해야합니다. equals(Object obj)

public enum Gender {
    MALE, FEMALE;
}

이 경우 하나의 인스턴스 만 있습니다. FEMALE 존재합니다 == 사용하기에 안전합니다.

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