关于字符串拼接,我们一般使用+号对String类进行拼接,但实际上这是一种非常不高效的方法,而另一种方法就是使用StringBuilder类的append方法,这是一种非常高效的方式。

今天也是被面试官问到StringBuilder为什么比String拼接字符串速度要快,我回答了StringBuilder的append方法的复杂度是o(1)(回答错了),String类的 + 拼接方法复杂度是O(n),但是append的原理没有答上来,所以面试结束之后赶紧打开idea看源码,把了解到的一些知识总结一下吧。

首先新建一个StringBuilder的默认大小容量是16:我们可以看到这里调用了super方法,因为StringBuilder继承了AbstractStringBuilder类,所以我们跟踪到AbstractStringBuilder类里面看一下。

可以看到就是调用了父类的这个构造方法。OK,现在我们就来看一下append方法具体是怎么实现的。 我们一append(str)为例子看一下:

同样里面是直接调用了父类AbstractStringBuilder的append方法


我们来分析一下这个方法中的几个关键方法:

(1)ensureCapacityInternal(count + len):确保现在数组value能够装下拼接之后的字符串。

(2)putStringAt(count, str):关键方法,调用了String类里面的getBytes方法

然后调用了System.arraycopy()方法

这是一个本地方法,具体作用就是从源数组src取元素,范围为下标srcPos到srcPos+length-1,取出共length个元素,存放到目标数组中,存放位置为下标destPos到destPos+length-1,简单来说就是数组复制。

所以我们可以知道StringBuilder类的append方法底层是调用了System.arraycopy()完成字符串的拼接,其复杂度是O(n),n是要拼接字符串的长度。

接下来我们来讨论一下用+号进行字符串拼接:

我么都知道+号拼接字符串效率没有append()方法效率高,那这是为什么呢?假如现在有这样一条语句 str1+=str2;我们编译器在遇到这条语句时会调用StringBuilder(str1)产生一个StringBuilder对象,然后再调用这个对象的append(str2)方法对字符串进行拼接,最后调用toString()方法返回拼接好的字符串。所以+号的底层原理还是StringBuilder的append方法,但它的效率却低了不少,因为调用了两次append方法,还有一次是StringBuilder(str1)这里调用了一次append(str1)方法。

所以+号的复杂度是O(n+m);

StringBuilder的append方法原理相关推荐

  1. 循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展

    循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展

  2. 对StringBuilder的append方法底层详解

    首先查看builder对象的初始化 StringBuilder builder = new StringBuilder(); 在该方法内指向了超类的构造方法,并传入了一个int值,它的形参名为:容积( ...

  3. Java入门第82课——StringBuilder的append方法

    问题 StringBuilder类提供将各种数据类型变量的字符串形式追加到当前序列中的append方法,在Java API中提供的append重载方法如图-15所示: 本案例要求将字符串"j ...

  4. append方法的原理

    StringBuilder 中append()方法的原理 1.简介: append()方法是用来拼接字符串的,在循环语句中使用可提高代码效率[1]. 2.用法: //用法一 StringBuilder ...

  5. StringBuilder的构造方法和append方法

    package com.learn.demo06StringBuilder; /*StringBuilder的常用方法:public StringBuilder append(...):添加任意类型数 ...

  6. java stringbuffer原理_String,StringBuilder,StringBuffer 实现原理解析

    定义: 从jdk1.5开始提供的新的封装字符串的类,StringBuilder,其字符串拼接操作的效率远远高于 String. Java里面提供了String,StringBuffer和StringB ...

  7. String“+”与StringBuffer/StringBuilder 对象的append方法

    该题来自华为.          字符串是Java程序中最常用的数据结构之一.在Java中String类已经重载了"+".也就是说,字符串可以直接 使用"+"进 ...

  8. #StringBuilder中的append方法 @FDDLC

    StringBuilder中 的append方法有很多重载形式: 核心实现在其父类AbstractStringBuilder中. 一.public StringBuilder append(char ...

  9. java replace stringbuilder_JAVA 中Stringbuilder类的方法

    展开全部 StringBuilderpublic StringBuilder() 构造一个其中不带字符的字符串生成器,初始容量为 16 个字符.62616964757a686964616fe59b9e ...

最新文章

  1. 精通GridView(C#) (二)
  2. 001 Servlet 介绍
  3. 坚强生活(转)--To 小鱼,妹妹和傻女孩们
  4. linux top p 乱码,将Linux top命令输入到指定文件时的乱码问题
  5. 《剑指offer》用两个栈实现队列
  6. TCp传输粘包问题
  7. HDU1232 畅通工程
  8. ASP.NET Core Web API中使用Swagger
  9. 多个服务器数据互通_5月23日部分服务器数据互通公告!
  10. Ubuntu 设置网卡固定IP
  11. Scality试图将对象存储转移到磁带和云中
  12. linux负载均衡总结性说明(四层负载/七层负载)
  13. 解决vmrc的连接已断开,正在尝试重新连接
  14. 乌龟git安装和使用
  15. 移动机器人系列4——移动机器人动力学
  16. SpringBoot + Vue 前后端分离的小案例
  17. 讲解如何在HTML中添加背景图片?
  18. DNS解析常见问题:如何清理DNS缓存?
  19. google 输入栏不显示历史搜索记录方法
  20. 音视频入门 (iOS上fdk-aac的交叉编译)

热门文章

  1. python 编译器spyder 安装_Spyder-Python-安装外部软件包
  2. 嵌入式Linux--Lichee Pi Zero系统烧录方式
  3. 学会这5个CAD小技巧,CAD绘图效率翻10倍!
  4. 用java写一个四则运算计算器
  5. Vue生命周期(初始阶段、挂载阶段、更新阶段、销毁阶段)
  6. 荷兰华侨新天地:海牙小龙虾泛滥 政府头痛不已
  7. openthread state一直显示detached
  8. 怎么解决高并发下抢红包和商品超卖问题?
  9. 世界第一位半机械人出现
  10. Linux中修改hostname立即生效的方法