Java의 캐릭터, 정수 및 유사한 유형 비교 : Equals 또는 ==?
문제
나는 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()
.
조차도 (특히) 그 객체가 원시 래퍼 유형 바이트, 문자, 짧은, 정수, 길고, 플로트, 이중 및 부울 인 경우.
"==
"객체의 정체성을 비교하고 당신은 당신이 원하는 것을 매우 드물게 비교할 수 있습니다. 그리고 원시 포장지와 함께 원하는 것을 절대 절대하지 마십시오.
만 사용합니다 ==
이 두 시나리오 중 하나에서 :
- 비교와 관련된 모든 값은 원시 유형입니다 (바람직하게는 부동 소수점 번호가 아닙니다)
- 두 참조가 동일한 개체를 참조하는지 실제로 알고 싶습니다 (여기에는 비교가 포함됩니다.
enum
s, 값이 객체 아이덴티티에 바인딩되기 때문에)
//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를 사용하거나 원시 값을 비교해야합니다.
박스형 값이 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
존재합니다 ==
사용하기에 안전합니다.