前几天,有个同事问了我一个表面看起来显而易见的问题,是关于String的,我们一起来看一下(如果有说的不正确的地方,欢迎大家指正)。

java中,字面量在编译期计算,并且String字面量作为常量,存储在方法区中,仅保留一份。带有变量的计算,在运行期执行。那么,str3在执行的时候,发生了什么。

第一步,初始化一个StringBuilder对象,并在构造器中调用父类AbstractStringBuilder的构造器,初始化一个长度16的字符数组

第二步,调用StringBuilder的append()方法,传入变量str1,内部调用父类AbstractStringBuilder的append()方法

在入参不为null的情况下,先调用ensureCapacityInternal()方法,判断拼接后的字符串长度是否超过当前字符数组的长度。如果超过了,就计算一个新的长度,然后创建一个新的数组,将现有数组的值复制给它,

具体扩容规则是,将当前字符数组长度扩容一倍再加2,如果扩容后的数组长度还不够,就和Integer.MAX_VALUE - 8(即MAX_ARRAY_SIZE)比较,如果还不够,则就用拼接后的字符串长度,但是最大也不能超过Integer.MAX_VALUE。(有一个newCapacity <= 0的判断,是考虑到value.length << 1变负数;至于扩容一倍还要+2,个人以为是为了提高性能,普遍计算得出,如果有不同理解,欢迎大家评论)

第三步,调用str.getChars()方法,将入参字符串拼接到现有的字符数组后面,实际操作是调用本地方法

System.arraycopy()。

第四步,记录下字符个数,最后返回当前StringBuilder对象。

第五步,拼接字符串”bbb”,重复第二步到第四步,

最后,调用StringBuilder的toString方法,去掉多余的空字符,返回一个当前累计字符长度的String对象,

其实也是调用本地方法System.arraycopy()。复制一个新的字符数组。正好符合String的不变类特性。

最新文章

  1. vs2012 打开解决方案崩溃或者点击项目崩溃
  2. Object-C中动态类型对象相关操作汇总
  3. Oracle数据库--SQL
  4. English idioms
  5. 基于HTML5实现的中国象棋游戏
  6. quartz 2.2.1 jdbc 连接池参数配置
  7. 事件流处理框架NEsper for .NET z
  8. Hibernate Mapping Exception:-9
  9. Linux必知必会的目录与启动过程
  10. MongoDB基础学习
  11. Oracle 执行计划(三)-------表连接方式
  12. day16
  13. remote: Repository not found. fatal: repository &#39;https://github.com/***/***.git/&#39; not found
  14. vue-cli 2.x脚手架build目录中的webpack.base.conf.js配置文件
  15. easyui-combobox的option选项为true与false时的问题
  16. 20145232韩文浩 《网络对抗技术》 Web基础
  17. Maven私服nexus
  18. gentoo Cataclysm - Dark Days Ahead
  19. first one
  20. Delphi避免重复打开窗体

热门文章

  1. 运行control userpasswords2实现winXP自动登录
  2. wpf的webbrowser与javascript交互
  3. PE格式大图
  4. 喜迎Win10周年版,芒果TV UWP完善手机视频离线下载
  5. volatile变量理解 via《Java并发编程实战》
  6. C#管理服务停止启动
  7. 智能合约开发——以太坊 DApp 实现 购买通证token
  8. Android无布局文件下自定义通知栏notification的 icon
  9. SYN5006型电机同步编码脉冲分配器
  10. Spring之bean生命始末