博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
走近Java之幕后的String
阅读量:5101 次
发布时间:2019-06-13

本文共 943 字,大约阅读时间需要 3 分钟。

前几天,有个同事问了我一个表面看起来显而易见的问题,是关于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的不变类特性。

转载于:https://www.cnblogs.com/wangl110/p/10721018.html

你可能感兴趣的文章
【CCF】炉石传说 模拟
查看>>
Zlib文件压缩和解压
查看>>
Eclipse远程部署
查看>>
在 Visual Studio Code 中使用 PoweShell - CodeShell
查看>>
配置管理工具---SVN
查看>>
TypeScript学习笔记(二):基本数据类型及数据转换
查看>>
c++ primer打卡(三)
查看>>
MongoDB-Getting Started with the C# Driver
查看>>
git bash上传代码到github
查看>>
Authentication for the REST APIs
查看>>
爬虫学习笔记(一)初识爬虫
查看>>
javascrip之prototype
查看>>
RecycleView
查看>>
Web Service初探
查看>>
HTML中的行内元素和框元素详解
查看>>
如何获取手机号码?
查看>>
设计模式概述
查看>>
【刘润五分钟商学院】-151幸存者偏见
查看>>
瑜伽扭身祈祷式动作教程
查看>>
vs2008 jquery 智能提示
查看>>