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 ...
随机推荐
- PHP 下载中文乱码解决
利用 iconv() 函数解决乱码 $file_name = iconv("utf-8","gb2312",$file_name); 原文链接 http://m ...
- IDEA创建一个Mybatis逆向工程
Mybatis逆向工程简介: MyBatis Generator (MBG) 是一个Mybatis的代码生成器 MyBatis 和 iBATIS. 他可以生成Mybatis各个版本的代码,和iBATI ...
- windows下怎么生成github的ssh公钥
windows下如何生成github的ssh公钥: 1.首先你要安装Git工具 2.在C:\Documents and Settings\Administrator\目录下,运行Git Bash he ...
- 【Maven】从Maven中导出项目依赖的Jar包
从SVN上下载源代码 svn export https://10.200.1.201/xxxx/PLATFORM code/ --force --username xxx --password xxx ...
- 【IIS错误】IIS各种错误
IIS简介 当用户试图通过HTTP或文件传输协议(FTP)访问一台正在运行Internet信息服务 (IIS)的服务器上的内容时,IIS返回一个表示该请求的状态的数字代码.该状态代码 记录在IIS日志 ...
- 远程服务器安装mysql数据库
https://www.cnblogs.com/renjidong/p/7047396.html 1.新开的云服务器,需要检测系统是否自带安装mysql # yum list installed | ...
- get和post的解析
get 直接获取数据 post 将数据发送到服务端缓存下来,当无法缓存数据或用户输入未知字符时用post, get:常用于数据 post:不想缓存数据,不再浏览器中缓存数据,在服务端可以,因为取数据及 ...
- HDFS的工作流程
HDFS的工作机制 概述 HDFS集群分为两大角色:NameNode.DataNode NameNode负责管理整个文件系统的元数据 DataNode 负责管理用户的文件数据块 文件会按照固定的大小( ...
- spring 定时任务 scheduled Cron表达式
转载:https://blog.csdn.net/u011789653/article/details/51153536 可以借鉴:https://www.cnblogs.com/softidea/p ...
- MySQL 删除重复数据实例
如何删除重复数据 业务场景:删除评论表中对同一订单同一商品的重复评论,只保留最早的一条. 查看是否存在对于同一订单同一商品的重复评论. SELECT order_id,product_id,COUNT ...