java中加号和append_Java中使用+号连接字符串和使用StringBuilder的append方法连接字...

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代表生成字节码,生成的字节码如下所示:

![在

c8960bca566915c427028e3f3ab24e87.png

由以上字节码我们可以看出,首先根据“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方法的字节码:

4acfb0ce44d1f74c2a6bf4a29ad2de95.png

可以看出,第五行到第三十五行构成了一个循环体,也就是说每经过一次循环都需要新建一个StringBuilder对象,而原来的StringBuilder对象则成为了垃圾,等待垃圾回收器的回收,但是垃圾回收机制是周期性运行的,也就是说当循环量较大时会造成大量的内存消耗,使得程序的性能降低

再来看看useAppend方法的字节码,该方法只使用了StringBuilder类的append方法来进行字符串的连接操作

79b4ea28cc5d9ccf6de9b69cb5512059.png

第十行和第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),中文就是接口描述语言,简单的说就是给调用方的开发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值