We use equality to check if two things are the same. Kotlin has two ways: == checks if the content is the same, and === checks if they are the exact same object.
When you want to see if two strings have the same letters.
When you want to check if two variables point to the exact same object in memory.
When comparing simple data like numbers or data classes for equality.
When you want to avoid bugs caused by confusing content equality with object identity.
Syntax
Kotlin
a == b // checks if a and b have the same content (structural equality)
a === b // checks if a and b are the same object (referential equality)
== calls equals() under the hood, so it compares content.
=== checks if both variables point to the same place in memory.
Examples
Here, == is true because the text is the same. === may be true or false because they might be different objects.
Kotlin
val x = "hello"val y = "hello"println(x == y) // trueprintln(x === y) // might be true or false depending on string interning
a and b point to the same object, so === is true. c is a different object.
Kotlin
val a = Any()
val b = a
val c = Any()
println(a === b) // trueprintln(a === c) // false
Data classes have equals() that checks content, so == is true. But they are different objects, so === is false.
This program shows the difference between == and === with data class objects.
Kotlin
dataclass Book(val title: String)
fun main() {
val book1 = Book("Kotlin Guide")
val book2 = Book("Kotlin Guide")
val book3 = book1
println(book1 == book2) // structural equalityprintln(book1 === book2) // referential equalityprintln(book1 === book3) // referential equality
}
OutputSuccess
Important Notes
Use == most of the time to compare values.
Use === when you want to check if two variables are exactly the same object.
Data classes automatically provide good equals() behavior for ==.
Summary
== checks if two things have the same content (structural equality).
=== checks if two things are the exact same object (referential equality).
Remember: == is for value comparison, === is for identity comparison.
Practice
(1/5)
1. In Kotlin, what does the operator == check when comparing two variables?
easy
A. If the two variables are the exact same object (referential equality)
B. If the two variables have the same content (structural equality)
C. If the two variables are of the same type
D. If the two variables are both null
Solution
Step 1: Understand the meaning of == in Kotlin
The == 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 B
Quick Check:
== means structural equality [OK]
Hint: Remember: == compares values, not object identity [OK]
Common Mistakes:
Confusing == with ===
Thinking == checks object identity
Assuming == checks type equality
2. Which of the following Kotlin expressions correctly checks if two variables refer to the exact same object?
easy
A. a === b
B. a != b
C. a.equals(b)
D. a == b
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 A
Quick Check:
=== means referential equality [OK]
Hint: Use === to check if two variables are the same object [OK]
Common Mistakes:
Using == instead of === for object identity
Confusing .equals() with ===
Assuming != checks referential equality
3. What will be the output of the following Kotlin code?
val a = "hello"
val b = String(charArrayOf('h', 'e', 'l', 'l', 'o'))
println(a == b)
println(a === b)
medium
A. true\nfalse
B. false\nfalse
C. true\ntrue
D. false\ntrue
Solution
Step 1: Evaluate a == b
Both strings contain the same characters "hello", so a == b is true because it checks structural equality.
Step 2: Evaluate a === b
They are two different String objects in memory, so a === b is false because it checks referential equality.
Final Answer:
true\nfalse -> Option A
Quick Check:
== true, === false [OK]
Hint: == checks content, === checks if same object [OK]
Common Mistakes:
Assuming === is true because contents match
Confusing == with ===
Thinking different objects with same content are ===
4. Consider this Kotlin code snippet:
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?
medium
A. Same object
B. Compilation error
C. Different objects
D. Runtime exception
Solution
Step 1: Understand listOf creates new objects
Each call to listOf(1, 2, 3) creates a new list object, so x and y are different objects.
Step 2: Check referential equality with ===
Since x and y are different objects, x === y is false, so the else branch runs.
Final Answer:
Different objects -> Option C
Quick Check:
=== false for different list objects [OK]
Hint: listOf creates new objects; === checks identity [OK]
Common Mistakes:
Assuming lists with same content are ===
Confusing structural and referential equality
Expecting compilation or runtime errors
5. You want to check if two variables 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?
hard
A.
if (a === b) {
println("Equal")
} else if (a == b) {
println("Not Equal")
} else {
println("Equal")
}
B.
if (a === b && a == b) {
println("Equal")
} else {
println("Not Equal")
}
C.
if (a == b) {
println("Not Equal")
} else if (a === b) {
println("Equal")
} else {
println("Not Equal")
}
D.
if (a == b || a === b) {
println("Equal")
} else {
println("Not Equal")
}
Solution
Step 1: Understand the condition needed
We want to print "Equal" if either a == b (same content) OR a === 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" when a == b is true.
if (a === b) {
println("Equal")
} else if (a == b) {
println("Not Equal")
} else {
println("Equal")
}
prints "Not Equal" incorrectly when a == b is true but a === b is false.
Final Answer:
if (a == b || a === b) -> Option D
Quick Check:
Use || to combine == and === checks [OK]
Hint: Use || to check either structural or referential equality [OK]
Common Mistakes:
Using && instead of ||
Confusing order of conditions
Printing wrong messages for conditions
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.