面试题:String,StringBuilder,StringBuffer三者的区别
摘要:总结Java中的String,StringBuilder,StringBuffer三者的区别和联系,介绍后两者的扩容机制。
Java中的String,StringBuilder,StringBuffer这三个类之间的区别主要集中在两个方面,即运行速度和线程安全这两方面。
String:字符串常量,这就导致每次对String的操作都会创建新的String对象,不仅效率低,而且浪费有限的内存空间;故适用于少量的字符串操作的场景。
StringBuilder:线程不安全,适用于单线程下在字符缓冲区进行大量操作的情况。
StringBuffer:线程安全,适用于多线程下在字符缓冲区进行大量操作的情况。
一般情况下,操作执行速度从快到慢依次是:StringBuilder > StringBuffer > String。这种比较是相对的,不是绝对的。String最慢的原因:String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,进行值操作的时候,是需要重新创建String对象的,但后两者的对象是变量,是可以更改的。
StringBuilder 和 StringBuffer 扩容机制:需要的最小容量(已经存储的数据长度+准备存储的数据的长度)是否大于底层char数组的长度,如果大于就按照原来长度*2+2扩容。
为什么扩容时要+2?请注意入参capacity的数据类型是int,故传入参数可以是0,在参数是0的情况下,0<<1运算结果也是0,导致以0初始化数组的时候必然会报错,所以从设计的安全性视角考虑,防止出现报错,选择了+2。
/**
* Constructs a string builder with no characters in it and an
* initial capacity specified by the {@code capacity} argument.
*
* @param capacity the initial capacity.
* @throws NegativeArraySizeException if the {@code capacity}
* argument is less than {@code 0}.
*/
public StringBuilder(int capacity) {
super(capacity);
}
初始化StringBuilder的容量。构造器StringBuilder() 会创建一个默认大小(通常是16)的字符数组。在使用中,如果需要扩容,就需要重新分配内存,创建一个更大的char数组,并将原先的数组复制过来,再丢弃旧的数组。在大多数情况下,可以在创建 StringBuilder 的时候指定大小,从而避免在容量不够的时候自动扩容,以提高性能。
示例:StringBuilder sb = new StringBuilder(700)
。
作为程序员,要有“刨根问底”的精神。知其然,更要知其所以然。这篇文章希望能抽丝剥茧,还原背后的原理。
面试题:String,StringBuilder,StringBuffer三者的区别的更多相关文章
- java面试题----String、StringBuffer、StringBudder区别
面试题1 - 什么情况下用+运算符进行字符串连接比调用StringBuffer/StringBuilder对象的append方法连接字符串性能更好? 面试题2 - 请说出下面程序的输出. class ...
- java中String StringBuilder StringBuffer比较和效率(性能)测试
string stringbuilder stringbuffer三者的区别 从JDK源码看,String.StringBuilder.StringBuffer都是存放在char[] 数组字符串. 简 ...
- Java中的String,StringBuilder,StringBuffer三者的区别?
package com.aaa.zxf.ajax.test; /** * 弄清楚 string stringBuilder StringBuffer 三者之间的关系? * * * 一. 三者都是用来对 ...
- String,StringBuilder,StringBuffer三者的区别
参考 String,StringBuilder,StringBuffer三者的区别 这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面. 1.运行速度 首先说运行速度,或者说是执行速 ...
- 33-Java中的String,StringBuilder,StringBuffer三者的区别
转载自:https://www.cnblogs.com/su-feng/p/6659064.html StringBuilder 详解 (String系列之2) Java中的String,String ...
- String StringBuilder StringBuffer区别
String StringBuilder StringBuffer String类是final类,不可以被继承,且它的成员方法也是final方法,当一个字符串对象进行操作操作时,任何的改变不会影响到这 ...
- Java—String,StringBuffer,StringBuilde区别和操作
Java语言有关字符串的类有三种 java.lang.String:一般作为简单字符串类型 java.lang.StringBuffer:字符串缓冲区 java.lang.StringBuider:字 ...
- String, StringBuilder, StringBuffer问题
1. 区别 String为字符串常量,而StringBuilder和StringBuffer都是字符串变量,其中StringBuilder线程非安全,StringBuffer线程安全. 每次对 Str ...
- JDK源码分析系列---String,StringBuilder,StringBuffer
JDK源码分析系列---String,StringBuilder,StringBuffer 1.String public final class String implements java.io. ...
- 深入源码剖析String,StringBuilder,StringBuffer
[String,StringBuffer,StringBulider] 深入源码剖析String,StringBuilder,StringBuffer [作者:高瑞林] [博客地址]http://ww ...
随机推荐
- 解决bootstrapvalidator配合select2插件不能正常校验的问题
我在使用bootstrapvalidator对select2插件进行校验时,出现了不能校验的问题,于是求助度娘,发现大多的解决方法是这样的: 1.添加一个隐藏域,将bootstrapvalidator ...
- C# Socket通信简单示例
https://files.cnblogs.com/files/mojiejushi/SocketDemo.rar
- laravel-echo-server 启动报错 [ioredis] Unhandled error event: ReplyError: NOAUTH Authentication required.
可以在 .env 文件加上以下配置 LARAVEL_ECHO_SERVER_REDIS_HOST= LARAVEL_ECHO_SERVER_REDIS_PASSWORD= LARAVEL_ECHO_S ...
- Thinkphp3.2 PHPMailer 发送邮件
第一步 :下载附件PHPMailer解压到ThinkPHP\Library\Vendor 第二步:在Common文件夹中的公共函数function.php中写一个发送邮件的函数, 这样可以在项目任意位 ...
- 业余无线电爱好者,自制天线比较容易上手天线“莫克森天线”Moxon
本文仅作为笔记分享,如有疑问可以留言交流. 莫克森天线尺寸计算软件:Moxon rectangle 高手门做的成品,参考资料: 英文文献资料:
- Java使用多线程处理未知任务数方案
知道任务个数,你可以定义好线程数规则,生成线程数去跑 代码说明: 虚拟线程池: 使用 Executors.newVirtualThreadPerTaskExecutor() 创建虚拟线程池,每个任务将 ...
- PII is hidden.
使用 Microsoft.AspNetCore.Authentication.JwtBearer 做验证的时候报错如下: IDX10503: Signature validation failed. ...
- MySQL 创建数据库并指定字符集编码
备忘 CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_general_ci; GRANT ALL ON mydb.* TO "use ...
- chatops
ChatOps是什么? ChatOps, 简单地说,这是一种方法,允许团队以聊天室的方式来协作和管理其基础结构.代码和数据的许多方面.通过使用聊天机器人和脚本,团队可以执行命令.查询信息,并将知识分发 ...
- JMeter跨线程传参总结