=== 用來確立 兩個 變數是否引用同一物件
第一組
fun main (){
// 1
var a = 0
// 2
var b = a
// 3
b = 1
println(a)
println(b)
}
結果:
0
1
a 和 b 都是基本型態 , 傳遞給 a 這個變數 value 0 , 在 2 的地方 a 這個變數 把 value 0 傳遞給 b, 此時 b 會是 0, 接下來在 3 的地方 又把 1 傳給 b , 最後的結果 a 變數的值 為 0 , b 變數的值 為 1
基本型態基本上是 call by value , 不適用檢查是否物件相等
第二組
fun main (){
var sa = "abcd"
var sb = sa
println(sb===sa)
sb.replace("a","c")
println(sb===sa)
println(sa)
println(sb)
}
結果:
true
true
abcd
abcd
昨天有說過 , 當要組合成新的字串 ,會從 String Pool , 找出 相符的 String 物件 , sb.replace("a","c") 會是另一個物件, 並非 原有的 String 物件轉變而來 。
這個物件並沒有任和變數指向他 , 他會是被冷落在一角的狀態 , 也並不會影響到sa 或 sb
所以最後 結果 sa 和 sb 是指向 同一個物件 "abcd" ,
第三組
fun main (){
//1
var la = mutableListOf(1,2,3,4)
//2
var lb = la
println(lb===la)
//3
lb.clear()
println(lb===la)
println(la)
println(lb)
}
結果:
true
true
[]
[]
在 二的地方, lb 和 la 指向同一個 mutableList 物件 , 在 3 的地方, lb 把 這個共同指向 mutableList 物件 清空, 理所當然 , lb 和 la 打印出來的值都會是空的 。
第四組
data class Test (var id:Int, var name :String)
fun main (){
//1
var ta = Test(0,"aaa")
//2
var tb = ta
println(tb===ta)
//3
tb.id = 1
println(tb===ta)
println(ta)
println(tb)
}
結果:
true
true
Test(id=1, name=aaa)
Test(id=1, name=aaa)
其實這組和上面是一樣的道理 ,只不過在這裡 把類別 從 mutableList 換成 Test 類別,在 二的地方, tb 和 ta 指向同一個 Test 物件 , 在 3 的地方, tb 變數調用 Test 物件 的 id 變數 ,將 1 傳給這個變數 。 這個共同指向 Test 物件 他的參數 id value 變成了 1 , 理所當然 , tb 和 ta 打印出來的id 參數 value 都會是1