软构学习心得:不变性

不变对象String与可变对象StringBuilder:

在学习过程中,一开始没有弄清楚String的不变性的含义,误以为String s 一旦被赋值便无法改变,很困惑如下代码及其输出:

String s = "a";
System.out.println("s:" + s);
s += "b";  //s = s + "b" 或 s= s.concat("b") 也可以实现
System.out.println("s:" + s);

代码输出如下: 

s:a
s:ab

后来仔细阅读教材,明白了String的不变性是指对象一旦被赋值便无法更改,而之所以上述3,4,5行代码可以成功修改s的值,是因为新建立了一个字符串ab,更改了s指向的对象,不变性是指对已经赋值的对象不能更改,需要通过新建一个对象实现,快照图如下:

再来看StringBuilder:

StringBuilder的可变性是指可以直接改变对象的值,代码及输出如下:

StringBuilder s = new StringBuilder("a");
System.out.println("s:" + s);
s.append("b");
System.out.println("s:" + s);

s:a
s:ab 

 对应的快照图如下:

 对不可变类型的修改会产生大量临时拷贝(需要垃圾回收,浪费内存);并且在有多个引用时会产生错误,例如下列代码:

String s = "a";
String t = s;
System.out.println("s:" + s);
System.out.println("t:" + t);
s += "b";
System.out.println("s:" + s);
System.out.println("t:" + t);
t += "c";
System.out.println("s:" + s);
System.out.println("t:" + t);

s:a
t:a
s:ab
t:a
s:ab
t:ac 

为什么会有以上输出呢,分析快照图即可:

再看下列代码及输出:

StringBuilder s = new StringBuilder("a");
StringBuilder t = s;
System.out.println("s:" + s);
System.out.println("t:" + t);
s.append("b");
System.out.println("s:" + s);
System.out.println("t:" + t);
t.append("c");
System.out.println("s:" + s);
System.out.println("t:" + t);

s:a
t:a
s:ab
t:ab
s:abc
t:abc 

分析快照图:

以上,即是我对String与StringBuilder的可变性,不变性的理解与理解过程收获心得。

可变mutable:

提供了可以改变内部数据的操作

不可变immutable:

其操作不改变内部值,而是构造新对象

以上仅是本人个人学习的过程体会总结,如有错误,欢迎及时指出探讨!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值