


Otherwise, structural equality is used, which disagrees with the standard so that NaN is equal to itself, NaN is considered greater than any other element, including POSITIVE_INFINITY, and -0.0 is not equal to 0.0. When an equality check operands are statically known to be Float or Double (nullable or not), the check follows the IEEE 754 Standard for Floating-Point Arithmetic. For values represented by primitive types at runtime (for example, Int), the = equality check is equivalent to the = check. a = b evaluates to true if and only if a and b point to the same object. Referential equality is checked by the = operation and its negated counterpart !=. Structural equality has nothing to do with comparison defined by the Comparable interface, so only a custom equals(Any?) implementation may affect the behavior of the operator. Functions with the same name and other signatures, like equals(other: Foo), don't affect equality checks with the operators = and !=. To provide a custom equals check implementation, override the equals(other: Any?): Boolean function. Note that there's no point in optimizing your code when comparing to null explicitly: a = null will be automatically translated to a = null. If you checked your local variable and it’s not null, nothing in the world could make it null, so Kotlin compiler allows to treat is as a non-null value. If a is not null, it calls the equals(Any?) function, otherwise ( a is null) it checks that b is referentially equal to null. Kotlin tries to provide null-safety even when the variable could be changed from another thread.
