Java中使用+号连接字符串和使用StringBuilder的append方法连接字
Java中使用+号连接字符串和使用StringBuilder的append方法连接字符串的联系和区别
我们先来看看这样一段代码
public class Main {
public static void main(String[] args) {
String mango = "mango";
String s = "abc" + mango + "def" + 47;
System.out.println(s);
}
}
我们用jdk自带的工具javap来反编译以上代码:
javap -c Main
这里的c代表生成字节码,生成的字节码如下所示:
![在
由以上字节码我们可以看出,首先根据“abc”字符串调用StringBuilder的构造函数生成一个StringBuilder对象,再依次调用StringBuilder类的append方法来实现字符串的连接,最后调用StringBuilder的toString方法将StringBuilder对象转化为String对象赋值给s,所以理论上来说在这种情形下用+连接字符串和用StringBuilder的append方法来连接字符串是差不多的。
public String useAdd(String[] params){
String result = "";
for(int i=0;i
result = result + params[i];
}
return result;
}
public String useAppend(String[] params){
StringBuilder sb = new StringBuilder();
for(int i=0;i
sb.append(params[i]);
}
return sb.toString();
}
先来看看useAdd方法的字节码:
可以看出,第五行到第三十五行构成了一个循环体,也就是说每经过一次循环都需要新建一个StringBuilder对象,而原来的StringBuilder对象则成为了垃圾,等待垃圾回收器的回收,但是垃圾回收机制是周期性运行的,也就是说当循环量较大时会造成大量的内存消耗,使得程序的性能降低
再来看看useAppend方法的字节码,该方法只使用了StringBuilder类的append方法来进行字符串的连接操作
第十行和第27行之间构成了一个循环体,而StringBuilder对象的创建在第四行,也就是说这种方法不会重复创建StringBuilder对象,不存在+连接字符串而带来的内存消耗问题。
当用循环体连接字符串最好不要用+,用StringBuilder或许是一种更好的选择,这就是两者的区别啦!!!觉得有道理的点个赞呗。
Java中使用+号连接字符串和使用StringBuilder的append方法连接字相关教程
[LeeetCode刷题]13. Roman to Integer 罗马数字转整型 Java
[LeeetCode刷题]13. Roman to Integer 罗马数字转整型 Java [LeeetCode刷题]13. Roman to Integer 罗马数字转整型 题目介绍 题目要求 开始思路 新的想法 具体代码 遇到的问题 Tips 题目介绍 链接: link. 编写一个程序完成将输入的罗马数字的String字符串转换
Windows Server 2008R2使用Batch脚本查看有效连接数
Windows Server 2008R2使用Batch脚本查看有效连接数 为什么80%的码农都做不了架构师? 问题 上次使用Python看了 一波远程端口,这次我们使用Win上面的Batch脚本,在控制台上面观察一波指端端口的有效连接数。 batch @echo off:beginecho netstat -ano | find
原生nodeJS使用
原生nodeJS使用 文章目录 NodeJS通用 npm和yarn 运行 导出和引入 文件路径处理 构建服务器 操作文件和目录 事件(广播) 传统Node处理异步数据 嵌入式模板ejs npm和yarn npm 一款JavaScript 包管理工具 创建项目依赖package.json存在package.json时执该命令可
lsun数据集下载、转换、使用
lsun数据集下载、转换、使用 最近复现SAGAN用到了lsun数据集 1.下载地址http://dl.yf.io/lsun/scenes/ 我下载了church_outdoor_train_lmdb.zip 中间还安装了lmdb库 2.转换 一般下载的data.py(转换代码)有bug,这段代码已经进行了修复,编译脚本并运行即可 p
使用sap在java中进行日志输出
使用sap在java中进行日志输出 为什么80%的码农都做不了架构师? 这里假设以及在工程中配置好了sap相关库文件。 定义日志变量 private static final com.sap.tc.logging.Location location = com.sap.tc.logging.Location.getLocation(xxx.class); 这里的 xxx.
使用scikit-learn构建模型
使用scikit-learn构建模型 1 绪论 致力于研究如何通过计算的手段,利用经验(历史数据)来改善系统自身的性能[机器学习]。 从数据中产生模型的算法,即“学习算法” 机器学习的应用如股票预测、垃圾邮件过滤软件等。 scikit-learn(sklearn)库整合了多种机器
java面试--java序列化及克隆
java面试--java序列化及克隆 序列化介绍: 序列化: 将java对象写入字节流;反序列化:从字节流中恢复对象 意义: 序列化机制允许将实现序列化的java对象装换位字节序列,这些字节序列可以保存在磁盘,数据库上,或者通过网络传输以达到以后恢复成原来的java
Spring boot中使用Swagger2
Spring boot中使用Swagger2 为什么80%的码农都做不了架构师? 问题 最近需要做接口开发,给客户端们调用,但是我又不想写文档,听说REST风格的接口都在用Swagger做IDL(Interface description language),中文就是接口描述语言,简单的说就是给调用方的开发