얼마나 혼란스러운가! 정수 b와 c의 동작이 다른 이유가 궁금한 독자에게 설명하자면, 자바는 크기가 작은 정수의 Integer 객체를 돌려줄 때는 메모리 절약을 위해 미리 메모화한(memoized) 공유 객체를 돌려준다. 그래서 valueOf(1)은 항상 같은 객체를 반환한다.8 안전성을 위해 자바에서는 항상 객체 동등성에 equals를 사용하고 원시 타입의 동등성에는 ==를 사용해야 한다. ==는 원시 타입에서는 값의 동등성을 계산하지만, 객체에서는 동일성을 계산한다.
코틀린은 더 단순하다. 동일성, 즉 참조 동등성(referential equality)은 ===로 검사한다. 동등성, 즉 구조 동등성(structural equality)은 ==로 검사하며, equals와 ==는 같다. 동등성 검사(==)가 동일성 검사(===)보다 더 짧기 때문에 많은 실수를 방지할 수 있다. ==와 ===를 각각 !=와 !==로 부정할 수 있다.
8 역주 자바 1.5까지는 -128~127까지를 이런 식으로 캐시했다. 자바 1.6부터는 JVM을 실행할 때 -XX:AutoBoxCacheMax=한도로 캐시 범위를 지정할 수 있다.