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 许多人,所不知道的是,每一种编程语言都有其对应的单元测试框架,对程序在不同阶段的测试环节也概念模糊.在实际动手编写程序许久之后才听 ...
随机推荐
- [LeetCode]题解(python):134-Gas Station
题目来源: https://leetcode.com/problems/gas-station/ 题意分析: 在一个圈子路线里面有N个汽油站,i站的汽油有gas[i]汽油.现在有一辆无限容量的车,它从 ...
- Apache proxy中转设置
参考http://sjsky.iteye.com/blog/1067119 打开http.conf (macOS中 Apache配置文件在/etc/apache2/中 etc是隐藏的) 确保下面 ...
- 自己动手写List集合(C#)
平时经常使用微软的List集合,觉得理所应当,这阵子突然意识到学编程学这么久,总不能只生存在某个平台某种语言下面.我觉得要跳出这个框,而数据结构是经常用到的,所以呢,作为一个有志向的程序员应该学会它. ...
- MVC-03 控制器(1)
Controller(控制器)在ASP.NET MVC中负责控制所有客户端与服务器端的交互,并且负责协调Model与View之间的数据传递,是ASP.NET MVC整体运作的核心角色. 一.关于Con ...
- Python单元测试:unittest使用简介
一.概述 本文介绍python的单元测试框架unittest,这是Python自带的标准模块unittest.unittest是基于java中的流行单元测试框架junit设计的,其功能强大且灵活,对于 ...
- html文件中文在浏览器中显示乱码问题解决
利用浏览器打开html文件时,中文显示乱码,如下是原文件的内容 1 <html> 2 <head> 3 <title> ...
- 定制ToolChain for ARM
**************************************************************************编写:王卫无,北京讯业互联科技有限公司版本号:V1. ...
- react的初涉入
1.react并不是一个完整的MVC,MVVM框架 它只负责view层 2.react跟Web Components不冲突 3.react的特点是“轻” 4.react用组件的方式重新思考构建UI的过 ...
- Axure使用
(一) Axure rp的界面 1-主菜单工具栏 大部分类似office软件,不做详细解释,鼠标移到按钮上都有对应的提示. 2-主操作界面 绘制产品原型的操作区域,所有的用到的元件都拖到该区域. 3 ...
- BZOJ 2882: 工艺( 后缀自动机 )
把串S复制成SS然后扔进后缀自动机里, 从根选最小的儿子走, 走N步就是答案了...一开始还想写个treap的...后来觉得太麻烦..就用map了... ----------------------- ...