Why is this an issue?

In Kotlin, == means structural equality and != structural inequality and both map to the left-side term’s equals() function. It is, therefore, redundant to call equals() as a function. Also, == and != are more general than equals() and !equals() because it allows either of both operands to be null.

Developers using equals() instead of == or != is often the result of adapting styles from other languages like Java, where == means reference equality and != means reference inequality.

What is the potential impact?

Wrong logic

== and != allow either of both operands to be null, while equals() doesn’t.

Readability and Understanding

The == and != operators are a more concise and elegant way to test structural equality than calling a function.

How to fix it

Replace a.equals(b) with a == b. Replace !a.equals(b) with a != b.

Code examples

Noncompliant code example

data class Person(
    val name: String,
    val firstName: String,
    val age: Int,
    val address: String
)
fun checkEquality() {
    val personA = Person("Claus", "Santa", 200, "North Pole")
    val personB = Person("Nicholas", "Saint", 1700, "Myra")
    if (personA.name.equals(personB.name)) { // Noncompliant, should use `==` instead
        // ...
    }
    if (!personA.equals(personB)) { // Noncompliant, should use `!=` instead
        // ...
    }
}

Compliant solution

fun checkEquality() {
    val personA = Person("Claus", "Santa", 200, "North Pole")
    val personB = Person("Nicholas", "Saint", 1700, "Myra")
    if (personA.name == personB.name) { // Compliant
        // ...
    }
    if (personA != personB) { // Compliant
        // ...
    }
}

Resources

Documentation