복붙노트

[SCALA] 스칼라에서 ==와 .equals의 차이점은 무엇입니까?

SCALA

스칼라에서 ==와 .equals의 차이점은 무엇입니까?

어떤 스칼라 == .equals와 () 사이의 차이이며, 어느 경우에 사용?

구현은 자바에서와 동일합니까?

편집 : AnyVal의 특정 사례에 대한 관련 질문 회담. 더 일반적인 경우는 모든이다.

해결법

  1. ==============================

    1.제대로 널 (null)을 처리하는 것을 제외하면 일반적으로 동등한에 ==,이 경로를 사용합니다. (거의 사용하지 않음) 참조 평등 EQ입니다.

    제대로 널 (null)을 처리하는 것을 제외하면 일반적으로 동등한에 ==,이 경로를 사용합니다. (거의 사용하지 않음) 참조 평등 EQ입니다.

  2. ==============================

    2.== 마지막 방법이며, 최종하지 않은, .equals를 호출합니다.

    == 마지막 방법이며, 최종하지 않은, .equals를 호출합니다.

    이것은 ==는 조작자가 아닌 방법으로 자바,보다 근본적으로 다르다 엄격 객체 참조 어떤지를 비교한다.

  3. ==============================

    3.참고 : 역이 true를 돌려줍니다 곳을 인수 예를 들어 1.equals을 전환하는 경우 등호의 경우에, 단지 자바로,이 같은 결과를 반환하지 않을 수 있습니다 (에서 BigInt (1)) false를 돌려줍니다. 이는 특정 유형을 확인하는 각각의 구현이다. 두 번째 인수는 번호도에서 BigInt 유형입니다 만, 다른 원시 형의 경우 원시 번호를 확인 해달라고

    참고 : 역이 true를 돌려줍니다 곳을 인수 예를 들어 1.equals을 전환하는 경우 등호의 경우에, 단지 자바로,이 같은 결과를 반환하지 않을 수 있습니다 (에서 BigInt (1)) false를 돌려줍니다. 이는 특정 유형을 확인하는 각각의 구현이다. 두 번째 인수는 번호도에서 BigInt 유형입니다 만, 다른 원시 형의 경우 원시 번호를 확인 해달라고

    AnyRef.equals는 (모든) 메소드는 서브 클래스에 의해 오버라이드 (override) 하나입니다. 너무 스칼라에 와서 한 자바 사양에서 방법. 언 박싱 인스턴스에서 사용되는 경우, (; INT-> 정수 자바에 더 명백한 스칼라에 숨겨진 불구하고)이 전화 박스입니다. 디폴트의 ​​구현은 단지 (자바로) 참조를 비교

    없음. == (상관) 방법은 두 가지 목적을 비교하여 어느 인자가 널이 될 수 있도록 (두 인스턴스와 정적 메소드를 호출하는 경우와 같이). 그것은 모두가 null의 경우, 다음은 박스 인스턴스에서 등호 (모두) 메소드를 호출 비교합니다.

    AnyRef.eq (AnyRef) 메소드는 예를 메모리에있는 위치, 즉 단지 참조를 비교한다. 이 방법에 대한 암시 권투가 없습니다.

  4. ==============================

    4.이 == 사이에 흥미로운 차이이며, float과 double 유형에 해당 : 그들은이 NaN을 다르게 취급 :

    이 == 사이에 흥미로운 차이이며, float과 double 유형에 해당 : 그들은이 NaN을 다르게 취급 :

    scala> Double.NaN == Double.NaN
    res3: Boolean = false
    
    scala> Double.NaN equals Double.NaN
    res4: Boolean = true
    

    편집 : 코멘트에 지적 된 바와 같이 - "이것은 또한 자바에서 일어나는는"- 정확히 무엇인지에 따라 달라집니다

    public static void main(final String... args) {
        final double unboxedNaN = Double.NaN;
        final Double boxedNaN = Double.valueOf(Double.NaN);
    
        System.out.println(unboxedNaN == unboxedNaN);
        System.out.println(boxedNaN == boxedNaN);
        System.out.println(boxedNaN.equals(boxedNaN));
    }
    

    이 인쇄됩니다

    false
    true
    true
    

    이 IEEE 부동 소수점 숫자가 그것을 정의하고 (어떻게 든 정체성의 개념과 놨 있지만)이 정말 모든 프로그래밍 언어에서 발생하는 방법이기 때문에 어떤지를 비교했을 때 그래서, unboxedNan 거짓 산출한다.

    박스형 NaN이 우리가 객체 참조를 비교하는 자바에서 ==를 사용하여 비교를 위해 진정한 산출한다.

    (가) 정말 언 박싱 두 배 값에 ==와 동일하게 행동해야 이럴 경우, 동일 위해 나는 설명이없는,하지만하지 않습니다.

    스칼라에 번역 문제는 스칼라 없음에 원시와 객체 유형을 통합하고 원시적 더블, 필요한 박스를 두 번 등으로 번역하고있다으로 조금 더 복잡하다. 따라서 스칼라 == 분명히 원시의 NaN 값의 비교에 귀결하지만 동일 박스 Double 값에 정의 된 하나를 사용 (계속 암시 적 변환 마법의 많은이 있고 RichDouble에 의해 두 배에 포주 물건이 있습니다).

    어떤 경우 당신이 정말로 알 필요가 있다면 실제로 NaN이는 때는 isNaN을 사용합니다 :

  5. ==============================

    5.스칼라는 널 값을 먼저 확인을 == 다음 호출에서 첫 번째 개체에 대한 방법과 동일

    스칼라는 널 값을 먼저 확인을 == 다음 호출에서 첫 번째 개체에 대한 방법과 동일

  6. from https://stackoverflow.com/questions/7681161/whats-the-difference-between-and-equals-in-scala by cc-by-sa and MIT license