Ever wondered why two things that look the same might still be different in your program?
Equality (== structural vs === referential) in Kotlin - When to Use Which
Imagine you have two boxes with the same toys inside. You want to check if the boxes are the same. Manually, you might look inside each box and compare every toy one by one.
This manual checking is slow and easy to mess up. Sometimes you might think two boxes are different just because they are different boxes, even if the toys inside are exactly the same. Or you might miss a toy and say they are the same when they are not.
Kotlin gives you two ways to compare: == checks if the contents (toys) are the same, and === checks if the boxes themselves are the exact same box. This makes comparing clear and easy.
if (box1 === box2) { println("Same box") } else { println("Different boxes") }
if (box1 == box2) { println("Boxes have same toys") } else { println("Boxes have different toys") }
This lets you quickly and correctly check if two things are truly equal in content or just the same object, avoiding confusion and bugs.
When checking if two user profiles have the same information, you want to compare their details (==), not if they are the exact same profile object in memory (===).
== checks if contents are equal (structural equality).
=== checks if two references point to the same object (referential equality).
Using the right equality avoids mistakes and makes your code clearer.
Practice
== check when comparing two variables?Solution
Step 1: Understand the meaning of
The==in Kotlin==operator checks if two variables have the same content, meaning their values are equal.Step 2: Differentiate from
The======operator checks if two variables point to the exact same object in memory, which is different from==.Final Answer:
If the two variables have the same content (structural equality) -> Option BQuick Check:
==means structural equality [OK]
- Confusing == with ===
- Thinking == checks object identity
- Assuming == checks type equality
Solution
Step 1: Identify the operator for referential equality
In Kotlin,===checks if two variables point to the exact same object in memory.Step 2: Confirm other options
==and.equals()check structural equality, and!=checks inequality, so they don't check referential equality.Final Answer:
a === b-> Option AQuick Check:
===means referential equality [OK]
- Using == instead of === for object identity
- Confusing .equals() with ===
- Assuming != checks referential equality
val a = "hello"
val b = String(charArrayOf('h', 'e', 'l', 'l', 'o'))
println(a == b)
println(a === b)Solution
Step 1: Evaluate
Both strings contain the same characters "hello", soa == ba == bis true because it checks structural equality.Step 2: Evaluate
They are two different String objects in memory, soa === ba === bis false because it checks referential equality.Final Answer:
true\nfalse -> Option AQuick Check:
==true,===false [OK]
- Assuming === is true because contents match
- Confusing == with ===
- Thinking different objects with same content are ===
val x = listOf(1, 2, 3)
val y = listOf(1, 2, 3)
if (x === y) {
println("Same object")
} else {
println("Different objects")
}What is the output and why?
Solution
Step 1: Understand listOf creates new objects
Each call tolistOf(1, 2, 3)creates a new list object, soxandyare different objects.Step 2: Check referential equality with
Since===xandyare different objects,x === yis false, so the else branch runs.Final Answer:
Different objects -> Option CQuick Check:
===false for different list objects [OK]
- Assuming lists with same content are ===
- Confusing structural and referential equality
- Expecting compilation or runtime errors
a and b in Kotlin either have the same content or are the exact same object. Which code snippet correctly prints "Equal" if either condition is true, and "Not Equal" otherwise?Solution
Step 1: Understand the condition needed
We want to print "Equal" if eithera == b(same content) ORa === b(same object) is true.Step 2: Check each option's logic
if (a == b || a === b) { println("Equal") } else { println("Not Equal") }uses logical OR (||) correctly.if (a === b && a == b) { println("Equal") } else { println("Not Equal") }requires both to be true (AND), which is too strict.if (a == b) { println("Not Equal") } else if (a === b) { println("Equal") } else { println("Not Equal") }incorrectly prints "Not Equal" whena == bis true.if (a === b) { println("Equal") } else if (a == b) { println("Not Equal") } else { println("Equal") }prints "Not Equal" incorrectly whena == bis true buta === bis false.Final Answer:
if (a == b || a === b)-> Option DQuick Check:
Use || to combine == and === checks [OK]
- Using && instead of ||
- Confusing order of conditions
- Printing wrong messages for conditions
Ready to prove it?
Pass the test and this pattern moves unknown
