最近期末复习看到数据类型可变与不可变这部分,感觉上课没太看明白的有了有点思路。
在Java中,有⼀些对象的内容是不变的 (immutable):⼀旦它们被创建,它们总是表⽰相同的值。另⼀些对象是可变的(mutable):它们有改变内部 值对应的⽅法。
String 就是不变对象的⼀个例⼦,⼀个 String 对象总是表⽰相同的字符串。⽽ StringBuilder 则是可变的,它有对应的⽅法来删除、插⼊、替换字符串内部的字符,等等。
以String和StringBuilder类型对象为例介绍可变类型和不可变类型的区别,因为 String 是不变的,⼀旦被创建,⼀个 String 对象总是有⼀样的值。为了在⼀个 String 对象字符串后加上另⼀个字符串,你必须创建⼀个新的 String 对象:
String s = "a";
s = s.concat("b");
代码运行时的快照图:
与此相对, StringBuilder 对象是可变的。这个类有对应的⽅法来改变对象,⽽不是返回⼀个新的对象:
StringBuilder sb = new StringBuilder ("a");
sb.append("b");
快照图如下:
java中还提供了final关键字来提供额外的不可变,而这种不可变是针对引用的。
final String s="a";
s=s.concat("b");
代码在编译时就会报错,因为我们为s指定了新的引用,而这与final的约束相违背。
当用final来修饰可变类型时:
final StringBuilder sb = new StringBuilder("abc");
sb.append("d");
sb = new StringBuilder("e");
因为本身数据类型是值可变的,所以当改变可变字符串sb的值时,由于sb指向的地址空间始终不变,则sb.append(“d”);是能够正常编译运行的,而
sb = new StringBuilder("e");是要改变sb的运用,其对应的地址空间也会改变,所以这个时候就会报错。



