String "+" 的补充说明---行粒度
String 中“+” 的操作的补充说明
在使用“+”的时候,会创建一个StringBuilder对象,然后invokevirtual append()操作
“+”操作创建StringBuilder的粒度是行代码。
String str = a+b+c;
这就是一行,这样他就会只new 一个StringBuider对象然后执行append操作,最后在调用toString()操作。
下面是两个例子:
public class Main{
public static void main(String[]args){
String a ="a",b="b",c="c";
String d = a+b+c;
}
}
这段简单代码的源码
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=, locals=, args_size=
: ldc # // String a
: astore_1
: ldc # // String b
: astore_2
: ldc # // String c
: astore_3
: new # // class java/lang/StringBuilder
: dup
: invokespecial # // Method java/lang/StringBuilder."<init>":()V
: aload_1
: invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
: aload_2
: invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
: aload_3
: invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
: invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
: astore
: return
LineNumberTable:
line :
line :
line :
在上面字节码文件中可以看见只有一个new(第九行),然后就执行了相关append 操作。-----------行粒度,这里是一行。、
下面设置为两行:
public class Main{
public static void main(String[]args){
String a ="a",b="b",c="c";
String d = a+b;
d = d+c; //切为两行
}
}
在次看看字节码
public static void main(java.lang.String[]);
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=, locals=, args_size=
: ldc # // String a
: astore_1
: ldc # // String b
: astore_2
: ldc # // String c
: astore_3
: new # // class java/lang/StringBuilder
: dup
: invokespecial # // Method java/lang/StringBuilder."<init>":()V
: aload_1
: invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
: aload_2
: invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
: invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
: astore
: new # // class java/lang/StringBuilder
: dup
: invokespecial # // Method java/lang/StringBuilder."<init>":()V
: aload
: invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
: aload_3
: invokevirtual # // Method java/lang/StringBuilder.append:(Ljava/lang/String;)Ljava/lang/StringBuilder;
: invokevirtual # // Method java/lang/StringBuilder.toString:()Ljava/lang/String;
: astore
: return
LineNumberTable:
line :
line :
line :
line :
在 9 、29两行 new
String "+" 的补充说明---行粒度的更多相关文章
- c++ string类使用及用string类解决整行字符串输入
下面随笔给出c++ string类使用及用string类解决整行字符串输入. string类 使用字符串类string表示字符串 string实际上是对字符数组操作的封装 string类常用的构造函数 ...
- Java学习笔记21(String类补充:正则表达式)
正如python的re模块,不过Java和Python的正则表达式有一些区别,这里做简单介绍,具体的细节可以参考网上其他的文章: 功能:可以用于检验一个字符串,比如验证用户名,验证密码格式,验证是否是 ...
- Git补充命令行操作操作
Git命令行基本操作这里有我之前整理的git基本操作,常用的操作. 本文以实际功能和实例来说明git GUI的实现原理. 单独更新特定文件 $ git checkout readme.md 删除特定文 ...
- C++ string功能补充(类型互转,分割,合并,瘦身)
int StringUtil::intFromString(string data) { //NOTE atoi是非标准C函数 return atoi(data.c_str()); } string ...
- C++ string的那些坑,C++ string功能补充(类型互转,分割,合并,瘦身) ,c++ string的内存本质(简单明了的一个测试)
1. size_type find_first_of( const basic_string &str, size_type index = 0 ); 查找在字符串中第一个与str中的某个字符 ...
- string行读入&&文件输入
普通读入的时候会以空格作为分隔符 直接用cin>>s读入,此时可以直接处理文件尾的情况 text代码: #include <iostream>#include <cstd ...
- 二、Redis基本操作——String(实战篇)
小喵万万没想到,上一篇博客,居然已经被阅读600次了!!!让小喵感觉压力颇大.万一有写错的地方,岂不是会误导很多筒子们.所以,恳请大家,如果看到小喵的博客有什么不对的地方,请尽快指正!谢谢! 小喵的唠 ...
- String 内在分配解析
1.String类概念 (1)String是final的,不可被继承.public final class String.String是的本质是字符数组char[], 并且其值不可改变.private ...
- 软工+C(11): 从命令行开始逐步培养编程能力(Java)
上一篇:助教指南,持续更新... // Version: 0.0.4 许多人,所不知道的是,每一种编程语言都有其对应的单元测试框架,对程序在不同阶段的测试环节也概念模糊.在实际动手编写程序许久之后才听 ...
随机推荐
- mysql xtrabackup 备份恢复实现,mysql命令备份数据库,打包压缩数据库
简介 Xtrabackup是由percona提供的mysql数据库备份工具,据官方介绍,这也是世界上惟一一款开源的能够对innodb和xtradb数据库进行热备的工具.特点: (1)备份过程快速.可靠 ...
- CDOJ 1259 昊昊爱运动 II bitset+线段树
题目链接 昊昊喜欢运动 他N天内会参加M种运动(每种运动用一个[1,m]的整数表示) 现在有Q个操作,操作描述如下 昊昊把第l天到第r天的运动全部换成了x(x∈[1,m]) 问昊昊第l天到第r天参加了 ...
- Mysql开启远程
改表法: x:\>mysql -u root -pvmware mysql> use mysql;mysql> update User set Host = ‘%’ where Us ...
- Python一些字符串判断和转换
设s是字符串: s.isalnum() 判断所有字符都是数字或者字母 s.isalpha() 判断所有字符都是字母 s.isdigit() 判断所有字符都是数字 s.islower() ...
- Sublime 编辑器主题
Sublime主题分为两种 一种是编辑框中的代码的颜色 另一种是编辑器本身的颜色(不只是颜色哟 Sublime编辑器左边侧边栏的字很小对不对 !有了主题就可以改) 这个主题叫做Soda http ...
- QT 获取文件MD5值
/* 方法1 */ QFile theFile(fileNamePath); theFile.open(QIODevice::ReadOnly); QByteArray ba = QCryptogra ...
- mysql读写分离
严格意义上讲,MySQL 读.写分离确实存在上述情况,这是由Master-Slave 异步复制存在延迟所导致的,且Master binlog的写入为多线程,而Slave同步的sql_thread为单线 ...
- HDU 2962 Trucking
题目大意:给定无向图,每一条路上都有限重,求能到达目的地的最大限重,同时算出其最短路. 题解:由于有限重,所以二分检索,将二分的值代入最短路中,不断保存和更新即可. #include <cstd ...
- JSTL与EL(转)
基本使用 <c:forEach items="${deptList}" var="dept"> <div ...
- 在LINUX的命令提示符及CMD命令提示符中显示时间
用途之一是可以查看某个命令或程序的执行时间. 一.CMD中显示时间设置 参数说明: $P:当前路径 $G:>(大于号) $T:当前时间,精确到0.01s 实验如下: C:\Users\g4-10 ...