java的String字符串拼接和StringBuffer的append的速度差异

2023-11-06

今天在leetcode上做题的时候发现,实现字符串拼接的时候,用StringBuffer的append比String的+快很多。思考了一下这两者的差别。

我是初学者,有说错的还请大家指正!


首先得出String的+拼接的时间

	public static void main(String[] args)
	{
		String str = "";
		String s = "abcd";
		
		long starttime = System.currentTimeMillis();
		for(int i = 0; i < 100000; i++)
		{
			str += s;
		}
		long stoptime = System.currentTimeMillis();
		System.out.println(stoptime - starttime);
	}

运行程序三次,得到的结果为 14726ms、14788ms、14930ms

姑且认为完成100000次拼接的时间为14800ms。


并且,在实验中发现,如果完成10000次拼接(十分之一规模)的时间是200ms左右,远小于上面时间的十分之一。


下面测试StringBuffer的append所用的时间

	public static void main(String[] args)
	{
		StringBuffer str = new StringBuffer();
		StringBuffer s = new StringBuffer("abcd");

		long starttime = System.currentTimeMillis();
		for(int i = 0; i < 100000; i++)
		{
			str.append(s);
		}
		long stoptime = System.currentTimeMillis();
		System.out.println(stoptime - starttime);
	}
运行程序三次,得到的结果为16ms、15ms、15ms

姑且认为完成100000次append的时间为15ms。

同时发现,append的时间复杂度似乎是N。这一点不太确定。


由上可见用StringBuffer的append来完成 “字符串拼接“ 比String的拼接快很多,特别是在量大的情况下。



但是这是为什么呢?

因为String是字符串常量,而StringBuffer是变量。

也就是说String型的数据,一旦被创建是不可修改的,对其进行修改的话,会另外创建一个新的String,然后把数据复制过去,旧的就当垃圾处理掉了。这样一来,效率就及其低下了。


那么StringBuffer是怎么做的呢?我发现了这么一段源码:

    /**
     * Appends the specified string to this character sequence.
     * <p>
     * The characters of the {@code String} argument are appended, in
     * order, increasing the length of this sequence by the length of the
     * argument. If {@code str} is {@code null}, then the four
     * characters {@code "null"} are appended.
     * <p>
     * Let <i>n</i> be the length of this character sequence just prior to
     * execution of the {@code append} method. Then the character at
     * index <i>k</i> in the new character sequence is equal to the character
     * at index <i>k</i> in the old character sequence, if <i>k</i> is less
     * than <i>n</i>; otherwise, it is equal to the character at index
     * <i>k-n</i> in the argument {@code str}.
     *
     * @param   str   a string.
     * @return  a reference to this object.
     */
    public AbstractStringBuilder append(String str) {
        if (str == null)
            return appendNull();
        int len = str.length();
        ensureCapacityInternal(count + len);
        str.getChars(0, len, value, count);
        count += len;
        return this;
    }

    // Documentation in subclasses because of synchro difference
    public AbstractStringBuilder append(StringBuffer sb) {
        if (sb == null)
            return appendNull();
        int len = sb.length();
        ensureCapacityInternal(count + len);
        sb.getChars(0, len, value, count);
        count += len;
        return this;
    }
粗略地看了一下代码,大概是StringBuffer型的数据的大小是可变的,在append时先增大其内存,然后利用getChars()将被append的数据复制过去。。
快就快在不用每一次都重新创建变量,每次复制的内容较少吧。。



另外,听说StringBuilder的效果更好。先留个坑,以后碰到了再研究。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java的String字符串拼接和StringBuffer的append的速度差异 的相关文章

  • 如何循环遍历所有组合,例如48 选择 5 [重复]

    这个问题在这里已经有答案了 可能的重复 如何在java中从大小为n的集合中迭代生成k个元素子集 https stackoverflow com questions 4504974 how to iteratively generate k
  • 动态选择端口号?

    在 Java 中 我需要获取端口号以在同一程序的多个实例之间进行通信 现在 我可以简单地选择一些固定的数字并使用它 但我想知道是否有一种方法可以动态选择端口号 这样我就不必打扰我的用户设置端口号 这是我的一个想法 其工作原理如下 有一个固定
  • org.apache.hadoop.security.AccessControlException:客户端无法通过以下方式进行身份验证:[TOKEN,KERBEROS] 问题

    我正在使用 java 客户端通过 Kerberos 身份验证安全访问 HDFS 我尝试打字klist在服务器上 它显示已经存在的有效票证 我收到的异常是客户端无法通过以下方式进行身份验证 TOKEN KERBEROS 帮助将不胜感激 这是一
  • Spring AspectJ 在双代理接口时失败:无法生成类的 CGLIB 子类

    我正在使用Spring的
  • Pig Udf 显示结果

    我是 Pig 的新手 我用 Java 编写了一个 udf 并且包含了一个 System out println 其中的声明 我必须知道在 Pig 中运行时该语句在哪里打印 假设你的UDF 扩展了 EvalFunc 您可以使用从返回的 Log
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 谷歌应用程序引擎会话

    什么是java应用程序引擎 默认会话超时 如果我们将会话超时设置为非常非常长的时间 会不会产生不良影响 因为谷歌应用程序引擎会话默认情况下仅存储在数据存储中 就像facebook一样 每次访问该页面时 会话仍然永远存在 默认会话超时设置为
  • string.Empty 与 null。您使用哪一个?

    最近工作的同事告诉我不要使用string Empty设置字符串变量时但使用null因为它污染了堆栈 他说不做 string myString string Empty but do string mystring null 真的有关系吗 我
  • 将流转换为 IntStream

    我有一种感觉 我在这里错过了一些东西 我发现自己做了以下事情 private static int getHighestValue Map
  • 在 junit 测试中获取 javax.lang.model.element.Element 类

    我想测试我的实用程序类 ElementUtils 但我不知道如何将类作为元素获取 在 AnnotationProcessors 中 我使用以下代码获取元素 Set
  • 帮助将图像从 Servlet 获取到 JSP 页面 [重复]

    这个问题在这里已经有答案了 我目前必须生成一个显示字符串文本的图像 我需要在 Servlet 上制作此图像 然后以某种方式将图像传递到 JSP 页面 以便它可以显示它 我试图避免保存图像 而是以某种方式将图像流式传输到 JSP 自从我开始寻
  • jdbc mysql loginTimeout 不起作用

    有人可以解释一下为什么下面的程序在 3 秒后超时 因为我将其设置为在 3 秒后超时 12秒 我特意关闭了mysql服务器来测试mysql服务器无法访问的这种场景 import java sql Connection import java
  • Hibernate 的 PersistentSet 不使用 hashCode/equals 的自定义实现

    所以我有一本实体书 public class Book private String id private String name private String description private Image coverImage pr
  • 像 Java 这样的静态类型语言中动态方法解析背后的原因是什么

    我对 Java 中引用变量的动态 静态类型和动态方法解析的概念有点困惑 考虑 public class Types Override public boolean equals Object obj System out println i
  • Spring Boot Data JPA 从存储过程接收多个输出参数

    我尝试通过 Spring Boot Data JPA v2 2 6 调用具有多个输出参数的存储过程 但收到错误 DEBUG http nio 8080 exec 1 org hibernate engine jdbc spi SqlStat
  • tomcat 中受密码保护的应用程序

    我正在使用 JSP Servlet 开发一个Web应用程序 并且我使用了Tomcat 7 0 33 as a web container 所以我的要求是tomcat中的每个应用程序都会password像受保护的manager applica
  • 使用 AsyncTask 传递值

    我一直在努力解决这个问题 但我已经到了不知道该怎么办的地步 我想做的是使用一个类下载文件并将其解析为字符串 然后将该字符串发送到另一个类来解析 JSON 内容 所有部件都可以单独工作 并且我已经单独测试了所有部件 我只是不知道如何将值发送到
  • Eclipse 启动时崩溃;退出代码=13

    I am trying to work with Eclipse Helios on my x64 machine Im pretty sure now that this problem could occur with any ecli
  • 包 javax.el 不存在

    我正在使用 jre6 eclipse 并导入 javax el 错误 包 javax el 不存在 javac 导入 javax el 过来 这不应该是java的一部分吗 谁能告诉我为什么会这样 谢谢 米 EL 统一表达语言 是 Java
  • 如何将双精度/浮点四舍五入为二进制精度?

    我正在编写对浮点数执行计算的代码的测试 不出所料 结果很少是准确的 我想在计算结果和预期结果之间设置一个容差 我已经证实 在实践中 使用双精度 在对最后两位有效小数进行四舍五入后 结果始终是正确的 但是usually四舍五入最后一位小数后

随机推荐

  • PHP性能优化

    PHP性能优化首先分为三个方向 PHP语言级别的性能优化 gt PHP周边问题的性能优化 gt PHP自身优化 一 PHP语言级别的性能优化 1 多使用PHP 的内置函数 2 少使用错误抑制符 会产生额外的opcode开销 opcode 当
  • 练习二、用JS语言输入数组并判断是否数组,并从小到大进行冒泡排序

    功能描述 在界面输入以逗号间隔开的字符串 转换成数组并判断是否有效 有效即进行排序 选择冒泡排序 主要考点 以输入框为输入参数入口 进行逐步推导 2 1 输入框是字符串需要转换成数组 2 2 一个输入框 要是输入双位数还是会分割成 单位数值
  • Linux中在线yum源的配置

    在线源的配置 配置环境 root localhost cat etc redhat release CentOS release 6 5 Final root localhost uname r 2 6 32 431 el6 x86 64
  • c语言六子棋(Alpha-Beta剪枝算法)

    c语言Alpha Beta剪枝算法六子棋 介绍 Alpha Beta剪枝算法是一种用于优化博弈树搜索的算法 可以在搜索过程中减少不必要的计算 从而提高搜索效率 该算法常用于博弈游戏 如六子棋 六子棋是一种类似于五子棋的棋类游戏 在一个六边形
  • 响应支付宝宣布的刷脸支付商业化

    二维码普及才没多久 刷脸支付已经悄无声息的走进我们的生活 刷脸支付作为一种全新的支付方式 将彻底改变人类的生活方式 有些人感慨道 这个时代变化太快了 快到一切技术的发展犹如坐上了火箭 去年8月中下旬 广电运通与深圳地铁腾讯共同打造生物识别
  • 为什么选择SpringCloud

    SpringCloud的诞生 SpringCloud是集成了众多开源的框架 利用SpringBoot的开发便利性实现服务治理 服务注册与发现 负载均衡 数据监控 REST API发布方式等 基本囊括了分布式框架所需要的所有功能 是一套易开放
  • 饮冰l于 2021-02-05 15:16:54 发布 1288收藏 11分类专栏: 图 文章标签: 算法 数据挖掘 机器学习 深度学习版权图 专栏收录该内容66 篇文章 23 订阅订

    前言 本文的作者认为对于 GNN 的可解释性不足 基于此 作者在节点分类任务上提出可以通过将忽略图结构的浅层模型与两个利用标签结构中相关性的后处理方法相结合 超越或匹配最先进的 GNN 具体如下 i 误差相关性 传播训练数据中的残余误差以纠
  • CMake编程实践(五) 编译静态库和动态库

    使用Cmake 编译库 本篇使用CMake编译一个动态库和静态库 并安装到系统中 对应的工程是cmake utilsbox lib 编译静态库 指定编译静态库 关键词为static 不添加关键字默认静态库 add library utils
  • 存档用【20考研】国家线/34所自划线 集合!【计算机和软件专业】

    为了同学们更方便快捷的了解34所院校的自划线和国家分数线 小编在这里开了一个专区 提供给同学们计算机 软件工程等相关专业的考研分数线 这是20考研的数据 我发现当时没有发 现在发一下存档用的 不发没办法设置链接 什么是A类 什么是B类 可以
  • 【Windows】如何使用Windbg检测Windows程序内存泄漏

    文章目录 使用Windbg检测Windows程序内存泄漏的步骤如下 启动程序 使用Windbg启动需要检测内存泄漏的程序 可以通过在Windbg中选择 文件 gt 打开程序 来打开程序 设置符号路径 在Windbg中 可以通过设置符号路径来
  • python 多线程模拟多用户访问接口

    coding utf 8 import threading import requests from urllib parse import quote 定义访问接口的函数 def access api user id params E4
  • Kafka数据丢失原因及解决方案

    Kafka包括Producer Broker Consumer 因此从这三个方面分析 Producer端 丢失原因 Kafka在Producer端的消息发送采用的是异步发送的方式 还有同步发送 但是同步发送会导致消息阻塞 需要等待 丢失数据
  • XSS漏洞学习

    原理 XSS攻击通常指的是通过利用网页开发时留下的漏洞 通过巧妙的方法注入恶意指令代码到网页 使用户加载并执行攻击者恶意制造的网页程序 这些恶意网页程序通常是JavaScript 但实际上也可以包括Java VBScript ActiveX
  • openmpi参数_Open MPI的目标、概念及实现

    目前 许多可用的MPI实现只关注HPC 高性能计算 的部分方面或是专注于解决某个具体问题 这导致了这些MPI实现不兼容 如果独立安装组合来获取它们的特有功能 Open MPI是在LAM MPI LA MPI and FT MPI的基础上的一
  • 目标检测如何计算召回率_目标检测+准确率、召回率、PR曲线、AP、mAp、mmAp

    查准率 查全率 AP map 参考知乎地址 https zhuanlan zhihu com p 94597205 TP True Positive 一个正确的检测 检测的IOU threshold 即预测的边界框 bounding box
  • JavaScript中常用的三种弹窗

    目录 一 alert 警告框 二 confirm 确认框 三 prompt 提示框 JavaScript 中可以创建三种消息框 警告框 确认框 提示框 一 alert 警告框 alert 方法是显示一条弹出提示消息和确认按钮的警告框 需要注
  • 【js】删除数组中的指定元素,且不改变原数组

    笨办法 export function remove arr item let result arr forEach function element if element item result push element return r
  • 样本不平衡问题分析与部分解决办法

    最近工作中在处理文本分类问题遇到了分类不均衡的问题 主要还是样本太少还同时非常的不均衡正负样本1 10 类别不平衡比例超过4 1 就会造成偏移 就使用了SMOTE方法 注意 在进行数据增广的时候一定要将测试集和验证集单独提前分开 扩张只在训
  • Doxygen简介及使用说明

    https blog csdn net Candy1232009 article details 80786179
  • java的String字符串拼接和StringBuffer的append的速度差异

    今天在leetcode上做题的时候发现 实现字符串拼接的时候 用StringBuffer的append比String的 快很多 思考了一下这两者的差别 我是初学者 有说错的还请大家指正 首先得出String的 拼接的时间 public st