字符串连接之“+”和append
1、String是只读字符串,即String引用的字符串内容是不可改变的。
1 String s1 = "abc";
2 s1 = "def"; //“abc”并没有改变,只是s1的指向改变了,原来的“abc”字符串变为了一个不可及对象
2、StringBuffer/StringBuilder 表示的字符串对象可以直接进行修改。
3、StringBuilder 是 Java5 中引入的,它和 StringBuffer 的方法完全相同,区别在于它是在单线程环境下使用的,
因为它的所有方法都没有被 synchronized 修饰,因此它的效率理论上也比 StringBuffer效率高。
接下来进入正题,解决效率的问题:
1 String s = "abc" + "def";
上面的代码在一般的开发中会被常常用到,但是这样做好不好,当然也不能简单的说好或者不好。分情况来看:
1、从效果上来看,两者是完全等效的。如果需要拼接的字符串并不是很多,可以使用“+”,因为代码量少,例如上面的代码。
2、从运行效率和资源消耗方面来讲,两者存在着很大的区别。
来看一段代码:
1 String s = "";
2 Random r = new Random();
3 for (int i = 0;i < 10;i++) {
4 s = s + r.nextInt(1000) + " ";
5 }
将上面的代码反编译之后,会看到编译器其实在每次循环中都是将“+”转化为StringBuilder对象,进行append。循环中的代码反编译的结果如下:
s = (new StringBuilder(String.valueOf(s))).append(rand.nextInt(1000)).append(" ").toString();
虽然 Java 有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用
大量的资源。解决这个问题的方法就是在程序中直接使用 StringBuilder 来连接字符串。代码如下:
1 String s = "";
2 Random r = new Random();
3 StringBuilder sb = new StringBuilder();
4 for(int i = 0; i < 10; i++){
5 sb.append(r.nextInt(1000));
6 sb.append(" ");
7 }
最后需要注意的是:“+”和StringBuilder不要混着用,否则,会创建更多的StringBuilder对象。
在这里,StringBuffer和StringBuilder的用法基本一样,后者是JDK5之后出来的,线程不安全,但是效率高。
字符串连接之“+”和append的更多相关文章
- 教你50招提升ASP.NET性能(二十三):StringBuilder不适用于所有字符串连接的场景;String.Join可能是
(41)StringBuilder is NOT the answer for all string concatenation scenarios; String.Join could be 招数4 ...
- C# 高效字符串连接 StringBuilder介绍
在介绍StringBuilder之前,必须要先了解string的特性. string在.NET中属于基本数据类型,也是基本数据类型中唯一的引用类型.字符串可以声明为常量,但它却放在了堆中. 一:不可改 ...
- JS中三种字符串连接方式及其性能比较
工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法 用连接符“+”把要连接的字符串连起来 ...
- Effective Java 第三版——63. 注意字符串连接的性能
Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...
- Java字符串连接的多种实现方法及效率对比
JDK 1.8(Java 8)里新增String.join()方法用于字符串连接.本文基于<Java实现String.join()和效率比较>一文,分析和比较四种自定义实现与String. ...
- Java字符串连接操作的性能问题
首先,看一段实验程序: package com.test; class StringTest { public static void main(String[] args) { long start ...
- Java字符串拆分和字符串连接
Java字符串拆分/连接 public class LierString{ //------------------------------------------------------------ ...
- JavaScript中三种字符串连接方式及其性能比较
参考地址: https://www.cnblogs.com/programs/p/5554742.html 工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方 ...
- [Java SE] 字符串连接
Java 支持多种字符串连接方式,总结如下: package cn.spads.tool.string; import java.text.MessageFormat; /** * <b> ...
随机推荐
- 10个Eclipse珍藏插件推荐
1.Open Explorer 打开资源管理器插件,这是一个从Eclipse里面可以直接定位打开windows资源管理器文件的插件,这个版本的插件在最新的Eclipse版本中都能使用. 下载地址:ht ...
- easyUI学习笔记二
1. 拖拉大小 <!DOCTYPE html> <html> <head> <title>easyui学习</title> <scr ...
- nowcoder A hard problem /// 数位DP
题目大意: 称一个数x的各个数位之和为f(x) 求区间L R之间 有多少个数x%f(x)==0 #include <bits/stdc++.h> using namespace std; ...
- ASP.NET Core 2.1 JWT Token 使用 (二) - 简书
原文:ASP.NET Core 2.1 JWT Token 使用 (二) - 简书 接上文,https://www.jianshu.com/p/c5f9ea3b4b65 ASP.NET Core 2. ...
- redis基础及基本命令
什么是redis Redis是一个Key-value存储系统,redis提供了丰富的数据结构,包括string(字符串),list(列表),sets(集合),ordered set(有序集合),has ...
- 第二则java读取excel文件代码
// 得到上传文件的保存目录,将上传的文件存放于WEB-INF目录下,不允许外界直接访问,保证上传文件的安全 String savePath = this.getServletContext().ge ...
- 转载 Tomcat集群配置学习篇-----分布式应用
Tomcat集群配置学习篇-----分布式应用 现目前基于javaWeb开发的应用系统已经比比皆是,尤其是电子商务网站,要想网站发展壮大,那么必然就得能够承受住庞大的网站访问量:大家知道如果服务器访问 ...
- node 添加个人经历的接口
1.定义experience const profileFields = {}; profileFields.experience=[]; 2.查找用户id const profile = await ...
- 适配器模式Adapter
原创转载请注明出处:https://www.cnblogs.com/agilestyle/p/11401410.html 1. 定义将一个类的接口转换成客户希望的另外一个接口.适配器模式使得原本由于接 ...
- 【基础】Maven生命周期
Maven是一个优秀的项目管理工具,它能够帮你管理编译.报告.文档等. Maven的生命周期: maven的生命周期是抽象的,它本身并不做任何的工作.实际的工作都交由"插件"来完成 ...