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



走近Java之幕后的String的更多相关文章
- Java 性能优化之 String 篇
原文:http://www.ibm.com/developerworks/cn/java/j-lo-optmizestring/ Java 性能优化之 String 篇 String 方法用于文本分析 ...
- java.lang.Class.forName(String name, boolean initialize, ClassLoader loader)方法
描述 Java.lang.Class.forName(String name, boolean initialize, ClassLoader loader) 方法返回与给定字符串名的类或接口的Cla ...
- JAVA中int、String的类型转换
int -> String int i=12345;String s="";第一种方法:s=i+"";第二种方法:s=String.valueOf(i); ...
- java内存分配和String类型的深度解析
[尊重原创文章出自:http://my.oschina.net/xiaohui249/blog/170013] 摘要 从整体上介绍java内存的概念.构成以及分配机制,在此基础上深度解析java中的S ...
- Java中区别.toString() ,(String),valueOf()方法
在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString(),(String)要转换的对象,St ...
- Java中如何将String转成Date
Java中如何将String转成Date 最近在开发Json数据反序列化为Java对象的时候发现spring mvc 和 Jackson 对Date类型对支持不是特别好,虽然在Java对象序列化为Js ...
- Exception in thread “main” com.google.gson.JsonSyntaxException: java.lang.NumberFormatException: empty String
String json="A valid json"; Job job = new Gson().fromJson(json, Job.class); Exception in t ...
- MySql系列:中文写入数据库出现错误java.sql.SQLException: Incorrect string value: '\xE5\xxxx' for column 'xxxx' at row 1及其解决方法
在将kft-activiti-demo的数据库连接改为mysql之后,可以正常登陆,但是在新建请假流程的时候出现如下错误: Caused by: java.sql.SQLException: In ...
- 【转】Java魔法堂:String.format详解
Java魔法堂:String.format详解 目录 一.前言 二.重载方法 三.占位符 四.对字符.字符串进行格式化 五.对整数进行格式化 六. ...
随机推荐
- WPF属性(一)依赖属性
原文:WPF属性(一)依赖属性 依赖属性是一种可以自己没有值,并能通过使用Binding从数据源获得值的属性,拥有依赖属性的对象称为依赖对象,在传统开发中,一个对象所占用的内存在调用new操作符进行实 ...
- 梧桐那时雨http://blog.csdn.net/fuchaosz/article/details/51882935?readlog
Ubuntu 16.04 一系列软件安装命令,包括QQ.搜狗.Chrome.vlc.网易云音乐安装方法 原创 2016年07月20日 11:44:01 标签: ubuntu 27024 1 简介 Ub ...
- 图像滤镜艺术---(Punch Filter)交叉冲印滤镜
原文:图像滤镜艺术---(Punch Filter)交叉冲印滤镜 (Punch Filter)交叉冲印滤镜 本文介绍一种交叉冲印效果的代码实现,至于原理,不在累赘,直接看代码: int f_TPun ...
- Windows 10开发基础——启动默认应用的URI
主要内容:通过指定的URI来启动默认的应用(设置,应用商店,地图,人脉) 方法一:直接在XAML中添加如下代码 <TextBlock x:Name="LocationDisabledM ...
- 零元学Expression Blend 4 - Chapter 4元件重复运用的观念
原文:零元学Expression Blend 4 - Chapter 4元件重复运用的观念 本章将教大家Blend元件重复运用的观念,这在Silverlight设计中是非常重要的,另外加码赠送渐层工具 ...
- WPF MVVM笔记
学习了一番WPF MVVM,记录一下,微软的连接(https://msdn.microsoft.com/zh-cn/magazine/dd419663.aspx) 1.mvvm就是model,view ...
- EasyUI之combogrid
html代码: <div class="item-label">@Html.L("Name"):</div> <input id= ...
- 01 Python初探
Python初探 Become a better version of yourself! 诞生 python的创始人为吉多·范罗苏姆(Guido van Rossum).1989年开始写Python ...
- 用Delphi实现文件下载的几种方法(三种使用控件的方法)
有个API就是UrlDownloadToFile.不仅如此,Delphi的一些控件也可以轻松实现下载,如NMHTTP,指定NMHTTP1.InputFileMode := ture; 指定Body为本 ...
- 微服务示例-Spring Cloud
1~开发准备 JDK:1.8 Spring Boot:1.5.9.RELEASE Spring Coud:Edgware.RELEASE IDE:IntelliJ IDEA 2017 Maven:3. ...
