String StringBuffer和StringBuilder区别及性能
结论:
(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder(推荐使用)。
String:不可变字符串;
StringBuffer:可变字符串、效率低、线程安全(大量方法被synchronized修饰);
StringBuilder:可变字符序列、效率高、线程不安全
参考引用文章:https://blog.csdn.net/weixin_41101173/article/details/79677982,https://blog.csdn.net/longfulong/article/details/78700239
1.性能比较
//以运算10w次来比较
package Reflect;
public class TestStringCount {
public static void main(String[] args) {
Long start = System.currentTimeMillis();
Long end;
String aa = "";
for (int i = 1; i < 100000; i++) {
aa = aa + "a";
}
end = System.currentTimeMillis();
System.out.println(end - start);
System.out.println("String usage:" + (end - start));
start = end;
final StringBuffer bb = new StringBuffer();
for (int i = 1; i < 100000; i++) {
bb.append("a");
}
end = System.currentTimeMillis();
System.out.println("StringBuffer usage:" + (end - start));
start = end;
final StringBuilder cc = new StringBuilder();
for (int i = 1; i < 100000; i++) {
bb.append("a");
}
end = System.currentTimeMillis();
System.out.println("StringBuilder usage:" + (end - start));
}
}
输出:
String usage:
StringBuffer usage:8
StringBuilder usage:4
2.分析。
String的值,即字符串常量,是不可变的,每次对String的操作(str=str+"a")都会在堆内存中生成新的对象(“a”),然后再连接,堆中的对象最后由GC进行回收,即每次“+”都要创建对象,拼接,以及GC不定期的回收,不仅效率低下也浪费内存空间。
BTW:堆区heap area,所有的对象和它们相应的实例变量以及数组将被存储在这里。每个JVM同样只有一个堆区。由于方法区和堆区的内存由多个线程共享,所以存储的数据不是线程安全的;栈区stack area,对每个线程会单独创建一个运行时栈。对每个函数呼叫会在栈内存生成一个栈帧(Stack Frame)。所有的局部变量将在栈内存中创建。栈区是线程安全的,因为它不是一个共享资源。栈帧被分为三个子实体:局部变量数组 – 包含多少个与方法相关的局部变量并且相应的值将被存储在这里,操作数栈 – 如果需要执行任何中间操作,操作数栈作为运行时工作区去执行指令,帧数据 – 方法的所有符号都保存在这里。在任意异常的情况下,catch块的信息将会被保存在帧数据里面.除堆栈还有方法区method area,所有类级别数据将被存储在这里,包括静态变量。每个JVM只有一个方法区,它是一个共享的资源。

3.继承关系
当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder 类。
和 String 类不同的是,StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
StringBuilder 类在 Java 5 中被提出,它和 StringBuffer 之间的最大不同在于 StringBuilder 的方法不是线程安全的(不能同步访问)。
由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类。
三者的继承结构
String StringBuffer和StringBuilder区别及性能的更多相关文章
- String、StringBuffer和StringBuilder区别及性能分析
1.性能比较:StringBuilder > StringBuffer > String 2.String <(StringBuffer,StringBuilder)的原因 S ...
- String、StringBuffer、StringBuilder区别
String.StringBuffer.StringBuilder区别 StringBuffer.StringBuilder和String一样,也用来代表字符串.String类是不可变类,任何对Str ...
- String、StringBuffer和StringBuilder区别
String.StringBuffer和StringBuilder区别 1.长度是否可变 String 是被 final 修饰的,他的长度是不可变的,就算调用 String 的concat 方法,那也 ...
- String,StringBuffer与StringBuilder
1. String,StringBuffer与StringBuilder的区别 String:存储在常量池中:是不可变的字符序列,任何对String值的改变都会引发新的String对象的生成,因此执行 ...
- Java String, StringBuffer和StringBuilder实例
1- 分层继承2- 可变和不可变的概念3- String3.1- 字符串是一个非常特殊的类3.2- String 字面值 vs. String对象3.3- String的方法3.3.1- length ...
- String,StringBuffer和StringBuilder
String,StringBuffer和StringBuilder分别应该在什么情况下使用? String 是Java的字符串类,其实质上也是用Char类型存储的,但是除了hash属性,其他的属性都声 ...
- String,StringBuffer和StringBuilder源码解析[基于JDK6]
最近指导几位新人,学习了一下String,StringBuffer和StringBuilder类,从反馈的结果来看,总体感觉学习的深度不够,没有读出东西.其实,JDK的源码是越读越有味的.下面总结一下 ...
- String,StringBuffer和StringBuilder的异同
String,StringBuffer和StringBuilder的异同 ...
- String, StringBuffer and StringBuilder
一 String 概述: String 被声明为 final,因此它不可被继承. 在 Java 8 中,String 内部使用 char 数组存储数据. public final class Stri ...
随机推荐
- create-react-app快速搭建react-app
npm i create-react-app -g 全局安装 create-react-app mydemo 创建一个项目,安装依赖 cd mydemo 进入mydemo目录 yearn sta ...
- RTB业务知识之1-原生广告
一.背景 Native Advertising (Native Ads), 又称为原生广告, 是2013全球媒体界爆红的关键词,从2012年年底,就有人开始提了这个名词,接着到处都可以看到这个名词,再 ...
- a message box to confirm the action
当点击窗口的X按钮时,弹出确认退出消息框,继续点击Yes,退出.否则,窗口继续处于打开状态 代码: """ This program shows a confirmati ...
- Heap堆分析(堆转储、堆分析)
一.堆直方图 减少内存使用时一个重要目标,在堆分析上最简单的方法是利用堆直方图.通过堆直方图我们可以快速看到应用内的对象数目,同时不需要进行完整的堆转储(因为堆转储需要一段时间来分析,而且会消耗大量磁 ...
- 廖雪峰Java2面向对象编程-4抽象类和接口-2接口
1.接口的定义 抽象方法本质上是定义接口规范. 在抽象类中定义了一个抽象方法,子类中必须实现这个抽象方法. public abstract class Person{ public abstract ...
- Underscore.js部分讲解
underscore是非常好用的封装库,大小只有4KB,大多插件都是以underscore为基础: underscore分5大部分:集合:数组:函数:对象:工具 集合:集合就是伪数组,虽然长的和数组一 ...
- python之路——5
王二学习python的笔记以及记录,如有雷同,那也没事,欢迎交流,wx:wyb199594 复习 1. 列表操作 增 append insert extend 删 remove pop clear d ...
- [UE4]图片按钮设置技巧
- [UE4]获得特定类型的所有Actor:Get All Actors Of Class、Get All Actors with Interface、Get All Actors with Tag
- ef-codefirst方式配置实体类,生成数据库
做项目的时候,如果我们如果用orm方式来做数据库持久化操作的话.微软官方首先会向我们推荐ef,而我们用ado.net的话,似乎也需要建立实体类来接传值,那么我们用codefirst就有一举两得的效果了 ...