StringBuilder的append方法原理
关于字符串拼接,我们一般使用+号对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方法原理相关推荐
- 循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展
循环体内,字符串的连接方式,使用StringBuilder的append方法进行扩展
- 对StringBuilder的append方法底层详解
首先查看builder对象的初始化 StringBuilder builder = new StringBuilder(); 在该方法内指向了超类的构造方法,并传入了一个int值,它的形参名为:容积( ...
- Java入门第82课——StringBuilder的append方法
问题 StringBuilder类提供将各种数据类型变量的字符串形式追加到当前序列中的append方法,在Java API中提供的append重载方法如图-15所示: 本案例要求将字符串"j ...
- append方法的原理
StringBuilder 中append()方法的原理 1.简介: append()方法是用来拼接字符串的,在循环语句中使用可提高代码效率[1]. 2.用法: //用法一 StringBuilder ...
- StringBuilder的构造方法和append方法
package com.learn.demo06StringBuilder; /*StringBuilder的常用方法:public StringBuilder append(...):添加任意类型数 ...
- java stringbuffer原理_String,StringBuilder,StringBuffer 实现原理解析
定义: 从jdk1.5开始提供的新的封装字符串的类,StringBuilder,其字符串拼接操作的效率远远高于 String. Java里面提供了String,StringBuffer和StringB ...
- String“+”与StringBuffer/StringBuilder 对象的append方法
该题来自华为. 字符串是Java程序中最常用的数据结构之一.在Java中String类已经重载了"+".也就是说,字符串可以直接 使用"+"进 ...
- #StringBuilder中的append方法 @FDDLC
StringBuilder中 的append方法有很多重载形式: 核心实现在其父类AbstractStringBuilder中. 一.public StringBuilder append(char ...
- java replace stringbuilder_JAVA 中Stringbuilder类的方法
展开全部 StringBuilderpublic StringBuilder() 构造一个其中不带字符的字符串生成器,初始容量为 16 个字符.62616964757a686964616fe59b9e ...
最新文章
- 精通GridView(C#) (二)
- 001 Servlet 介绍
- 坚强生活(转)--To 小鱼,妹妹和傻女孩们
- linux top p 乱码,将Linux top命令输入到指定文件时的乱码问题
- 《剑指offer》用两个栈实现队列
- TCp传输粘包问题
- HDU1232 畅通工程
- ASP.NET Core Web API中使用Swagger
- 多个服务器数据互通_5月23日部分服务器数据互通公告!
- Ubuntu 设置网卡固定IP
- Scality试图将对象存储转移到磁带和云中
- linux负载均衡总结性说明(四层负载/七层负载)
- 解决vmrc的连接已断开,正在尝试重新连接
- 乌龟git安装和使用
- 移动机器人系列4——移动机器人动力学
- SpringBoot + Vue 前后端分离的小案例
- 讲解如何在HTML中添加背景图片?
- DNS解析常见问题:如何清理DNS缓存?
- google 输入栏不显示历史搜索记录方法
- 音视频入门 (iOS上fdk-aac的交叉编译)