kotlin - kotlin var 的工作方式就像它是不可变的
问题描述
我试图找出 kotlin 中可变和不变性的区别。
var a = "abcd"
println(System.identityHashCode(a)) //495053715
var b = a
a = "1234"
println(System.identityHashCode(a)) //1922154895
println(System.identityHashCode(b)) // 495053715
最初,a
有一些价值。因此,在字符串池中创建了一个对象,并将其引用提供给a
该对象的哈希码为的变量495053715
然后,b
被赋值为a
So,其hashcode同上。这是错误的,我稍后会解释
现在,当a
值发生变化时,它的行为就像是不可变的。
为什么它又创建了一个带有哈希码的对象
1922154895
来加载值“1234”?
据我说,
它应该覆盖
495053715
之前值为“abcd” 的对象中的值然后
b
应该创建一个新对象
如果它满足以上几点,那么我可以接受它Mutable
。所以请用例子来澄清我。
解决方案
您将mutable一词的两种不同含义混为一谈。
当我们说变量或属性是可变的(使用var
关键字)时,这意味着我们可以重新分配它以指向不同的对象。
当我们说一个对象是可变的时,这意味着它包含公开可变的属性。
将属性或变量标记为可变var
允许将其重新分配以指向不同的对象。它对那些指向的对象是否可变没有影响。它不能赋予它碰巧指向的任何对象可变的属性。
String
总是不可变的。AString
var
是可以重新分配以指向不同的不可变String
s 的。
您在评论中提到了对 Java 的熟悉程度。var
与 Java 中未标记为的任何变量完全相同final
。