一.可变对象与不可变对象

Java中某些对象是可变的(mutable),它们有改变内部值的方法。例如,一个StringBuilder对象有办法来改变字符串内部的字符,等等。

StringBuilder sb = new StringBuilder("a");
sb.append("b");

快照图:

而不可变的对象一旦创建就无法改变(immutable)。例如如果要在一个String对象表示的字符串后面添加字符,只能重新创建一个String对象。

String s = "a";
s = s.concat("b"); // 使用s+="b" 或 s=s+"b"也能达到同样的效果

这段代码看上去与StringBuilder中的append方法相似,但效果不同:由于String对象被创建后就无法更改,所以实际上concat方法重新new了一个String对象让"a" "b"相连,并让s索引到这个对象。

快照图:

二.两者的区别

从结果上来看,使用String或者StringBuilder都让s索引到了一个表示字符串“ab”的对象,那么使用可变对象与不可变对象有什么区别呢?

考虑如下代码:

String s = "a";
String t = s;
s=s.concat("b");
//t=?

t理所当然等于"a"。

但是如果我们用StringBuilder替换String:

StringBuilder sb = new StringBuilder("a");
StringBuilder tb = sb;
sb=tb.append("b");
//tb=?

这时tb表示的字符串变成了"ab"。

为什么出现这种结果?

因为String是不可变对象,s调用方法concat后新创建了一个String对象,让s索引到上面,而t依旧指向原来的对象,所以仍然表示"a"。

而StringBuilder是可变对象,sb调用方法append后直接更改了指向的对象,同样指向该对象的tb表示的字符串也就跟着发生了变化。

Java中的可变类型与不可变类型相关推荐

  1. Java 中的 String 真的是不可变的吗

    转载自   Java 中的 String 真的是不可变的吗 我们都知道 Java 中的 String 类的设计是不可变的,来看下 String 类的源码. public final class Str ...

  2. Java中的String为什么是不可变的? -- String源码分析

    什么是不可变对象? 众所周知, 在Java中, String类是不可变的.那么到底什么是不可变的对象呢? 可以这样认为:如果一个对象,在它创建完成之后,不能再改变它的状态,那么这个对象就是不可变的.不 ...

  3. java中小数后加f_在 Java 中,小数默认为 ,如果要指定 类型请在小数后加 F/f 。_学小易找答案...

    [填空题]Java 语言采用双字节的 编码. [单选题]马斯洛需要层次论所提出的5种需要:生理需要.安全需要.归属需要.( ).自我实现需要 [填空题]String s= " abc &qu ...

  4. 43、在java中一个类被声明为final类型,表示了什么意思?

    43.在java中一个类被声明为final类型,表示了什么意思? 表示该类不能被继承,是顶级类. JAVA面试问题及答案大全

  5. java中数组的返回值是什么类型_面试必问:Java中String类型为什么设计成不可变的?...

    这几天在各大平台上都看到过这样一些帖子,全都是关于String类型对象不可变的问题,当然现在也是找工作的准备时期,因此花了一部分时间对其进行整理一下. 想要完全了解String,在这里我们需要解决以下 ...

  6. 面试题:为什么Java中的字符串对象是不可变的

    阅读本文大概需要 4分钟. 所谓不可变对象,是指一个对象在创建后,它的内部状态不会被改变的对象.这意味着当我们将一个不可变对象的引用赋值给某个变量后,我们就不能改变该对象的内部状态. James Go ...

  7. java如果把字符串转成对象_为什么Java中的字符串对象是不可变的,有什么好处?...

    专注于Java领域优质技术号,欢迎关注 原创: 阿杜的世界 阅读本文大概需要 4分钟. 所谓不可变对象,是指一个对象在创建后,它的内部状态不会被改变的对象.这意味着当我们将一个不可变对象的引用赋值给某 ...

  8. 关于java中求和的方法,用可变变量来解决这个问题

    在Java中可以说写一个求和的小程序是最简单不过的了.但是这里需要考虑的一个问题是有多少个参数传到方法体里面去进行求和呢? 举个例子,我们写一个a+b的程序相信大家都会,然后我们也会写一个a+b+c的 ...

  9. java中什么表示菜单项_下列类型中,表示菜单项的是( )。_学小易找答案

    [单选题]下列项目属于直接费用的是( ). [单选题]已知立体的三视图,选择正确的立体图 [填空题]气候统计预测,一般分为四步.首先,( );其次,( );再次,( );最后,( ). A 建立统计模 ...

  10. Java中的String类为什么不可变

    1.什么是不可变? java角度来讲就是说成final的. String不可变如下图: 假设给字符串s赋值为abcd,第二次重新赋值为abcdef,这时候并不是在原内存地址上修改数据,而是重新指向一个 ...

最新文章

  1. leetcode — maximum-subarray
  2. why my cloudDatabaseconfig bean Initialization failed
  3. 中检测到有潜在危险的 request.form 值。_洛宁县钢结构厂房加固检测设计中心
  4. [TJOI2008]彩灯
  5. LeetCode 873. 最长的斐波那契子序列的长度(动态规划)
  6. php 同时导出两个文件_使用orangehill/iseed自动反向生成数据填充文件
  7. VS code解决Latex不显示参考文献,正文中显示[?]的问题
  8. Netty线程模型和核心概念
  9. 蚂蚁上市员工人均一套大 House,阿里程序员身价和这匹配吗?
  10. js 中meta 移除head_浅析JS中数据结构
  11. java 进程和线程
  12. 电脑桌面上怎么找计算机,xp桌面上我的电脑图标不见了怎么找回来
  13. 初级程序员面试题总结(一):
  14. Kubernetes的Serializer解析
  15. 微信登录提示逻辑不正确_微信逻辑错误无法登录
  16. monodepth2训练细节
  17. 物联网技术在智慧校园中的应用
  18. 牛逼,个人开发者可以申请微信支付了!
  19. Java 线程池及参数动态调节详解
  20. ES7241D低功耗音频ADC芯片##小爱音响

热门文章

  1. “金链熊“已致200多家机构受害,或为年度最严重APT攻击事件
  2. 淘汰国足后反被附体?伊朗0:3不敌日本无缘决赛
  3. C发展史: KR C/C89/C99/C11 以及 C++发展史: C++98/C++03/C++11
  4. 【中秋征文】“海上生明月”中秋节网页特效
  5. Glide图片加载框架的使用
  6. 关于“拜占庭将军算法”byzantine generals problem
  7. vs 2019使用Installer Project制作安装包的问题
  8. 致远OA表单自定义函数(计算N年后今天的日期 )
  9. matlab建立学生档案,matlab程序设计入门20PPT18档案读写 .pptx
  10. 有限公司税收筹划如何开展? 增值税、所得税财政奖励是什么?