在解决这个问题之前,需要了解的内容:

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的更多相关文章

  1. 教你50招提升ASP.NET性能(二十三):StringBuilder不适用于所有字符串连接的场景;String.Join可能是

    (41)StringBuilder is NOT the answer for all string concatenation scenarios; String.Join could be 招数4 ...

  2. C# 高效字符串连接 StringBuilder介绍

    在介绍StringBuilder之前,必须要先了解string的特性. string在.NET中属于基本数据类型,也是基本数据类型中唯一的引用类型.字符串可以声明为常量,但它却放在了堆中. 一:不可改 ...

  3. JS中三种字符串连接方式及其性能比较

    工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方法,这里将它们一一列出顺便也对它们的性能做个具体的比较. 第一种方法  用连接符“+”把要连接的字符串连起来 ...

  4. Effective Java 第三版——63. 注意字符串连接的性能

    Tips 书中的源代码地址:https://github.com/jbloch/effective-java-3e-source-code 注意,书中的有些代码里方法是基于Java 9 API中的,所 ...

  5. Java字符串连接的多种实现方法及效率对比

    JDK 1.8(Java 8)里新增String.join()方法用于字符串连接.本文基于<Java实现String.join()和效率比较>一文,分析和比较四种自定义实现与String. ...

  6. Java字符串连接操作的性能问题

    首先,看一段实验程序: package com.test; class StringTest { public static void main(String[] args) { long start ...

  7. Java字符串拆分和字符串连接

    Java字符串拆分/连接 public class LierString{ //------------------------------------------------------------ ...

  8. JavaScript中三种字符串连接方式及其性能比较

    参考地址: https://www.cnblogs.com/programs/p/5554742.html 工作中经常会碰到要把2个或多个字符串连接成一个字符串的问题,在JS中处理这类问题一般有三种方 ...

  9. [Java SE] 字符串连接

    Java 支持多种字符串连接方式,总结如下: package cn.spads.tool.string; import java.text.MessageFormat; /** * <b> ...

随机推荐

  1. *arg,**kwargs的参数作用的疑惑

    先来看个例子: def foo(*args, **kwargs): print 'args = ', args print 'kwargs = ', kwargs print '----------- ...

  2. Mac os x安装IDEAL及配置JDK和Maven

    此文章是在已安装好IDEAL前提下进行配置jdk和maven的操作文档. 1. 下载并配置JDK及Maven Mac下载并配置JDK方法: 详见Mac安装JDK和JMeter5-安装JDK Mac下载 ...

  3. Linux系统实验

    前言:怎么感觉Linux运维和Linux系统实验没什么关系?该不会的还是不会(@@).记录一下几个实验吧. 本篇目录: 实验一 编程环境 实验二 文件读写 实验三 进程通信 实验一 编程环境√ 实验步 ...

  4. setquota - 设置磁盘配额或时间限制

    SYNOPSIS(总览) setquota [ -u | -g ] filesystem-name block-soft block-hard inode-soft inode-hard name.. ...

  5. 链表反转&交换链表结点

    leetcode链表反转链接 要求摘要: 反转一个单链表 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1-&g ...

  6. centos 搭建本地YUM源并使用apache共享YUM源

    搭建本地YUM源 1.挂载镜像 2.搭建本地YUM源 删除多余repo文件保留一个就行 本地YUM源就搭建好了 yum repolist 查看yum源 3.使用apache共享YUM源 YUM服务器配 ...

  7. k8s--网络模式

    1.clusterip kind: Service apiVersion: v1 metadata: name: my-service spec: selector: app: nginx ports ...

  8. MS Word2016加载EndnoteX6插件

    我的软件环境是:Win10 x64.MS Office 2016 x64.Endnote X6 32位. 在安装完MSO和Endnote后,Word中未能自动加载Endnote插件.现将启用方法记录如 ...

  9. 1.MVC的初步了解

    1.MVC简单介绍 1)原理(如图)如果想更加深入了解原理,可以访问此地址(https://www.cnblogs.com/uicodeintoworld/p/8950877.html) 理解:客户端 ...

  10. 手写实现indexOf

    突然奇想.自己手写一个indexOf package com.toov5.test; public class Test8 { public static int find(String str1, ...