当前位置: 首页 > news >正文

String、StringBuffer、StringBuilder比较

String、StringBuffer、StringBuilder三者是字符串中重要的内容,也是面试过程中经常问到的问题,下面就来总结一下三者的区别。

1.三者都可以存储和操作字符串。

2.String类提供了数值不可改变的字符串,即一旦定义的一个String对象,则不可以对其进行修改,要修改则是新创建了一个String对象。

String str = "a"+"b"+"c";

进行上述操作,则底层操作如下:

String s1 = "a";
String s2 = "b";
String s3 = "c";
String str = s1+s2+s3;

总共创建了四个对象。创建新的对象,则需要消耗更多的资源。

3.StringBuffer和StringBuilder可以对字符串进行修改,如要修改字符串,则是在原串上进行操作,不用进行新对象的创建。

4.StringBuilder:线程非安全

 StringBuffer:线程安全

5.由于以上原因,执行效率:StringBuiler>StringBuffer>String

下面进行代码演示,字符a连接10万个a,即进行10万次操作,可看出三者执行效率:

 1 public class Main {
 2 
 3     public static void main(String[] args) {
4 String str = "a";
5 long t1 = System.currentTimeMillis(); //获得的是自1970-1-01 00:00:00.000 到当前时刻的时间距离,单位为毫秒 6
      for(int i=0;i<100000;i++){
7 str = str+'a';
8 }
9 long t2 = System.currentTimeMillis();
10 System.out.println("String操作所用时间:"+(t2-t1)); 11 12 /*---------------------------------------*/ 13 14 StringBuffer sb = new StringBuffer("a");
15 long t3 = System.currentTimeMillis();
16 for(int i=0;i<100000;i++){
17 sb.append('a');
18 } 19 long t4 = System.currentTimeMillis(); 20
        System.out.println("StringBuffer操作所用时间:"+(t4-t3)); //获取StringBuffer操作所用的时间 21 22 /*---------------------------------------*/ 23 24 StringBuilder sd = new StringBuilder("a");
25 long t5 = System.currentTimeMillis();
26 for(int i=0;i<100000;i++){
27 sd.append('a');
28 } 29 long t6 = System.currentTimeMillis();
30 System.out.println("StringBuilder操作所用时间:"+(t6-t5)); //获取StringBuilder操作所用的时间 31 } 32 33 }

运行结果如下:

 

可以看出,StringBuffer和Stringbuilder操作效率比String高得多,StringBuilder操作效率稍微大于StringBuffer。

综上,三者使用场景如下:

(1)如果要操作少量的数据用String,更为简洁方便

(2)单线程操作字符串缓冲区下操作大量数据使用StringBuilder

(3)多线程操作字符串缓冲区下操作大量数据使用StringBuffer

 

转载于:https://www.cnblogs.com/cppeterpan/p/6978992.html

相关文章:

  • Android数据存储之ContentProvider
  • [BZOJ 3680]吊打XXX(模拟退火)
  • 可达性分析算法-确定那些对象是垃圾(转)
  • Android之使用ContentResolver对通信录中的数据进行简单操作
  • Android之网络操作 - 从网络获取图片或网页
  • OpenGL学习--开发环境
  • jQuery常用总结(转载)
  • Android之把从网络中获取的数据以XML与Json格式返回
  • 抗锯齿的BUG
  • Spring Boot 定时任务的使用
  • VC2012编译CEF3-转
  • Android之用HTTP的get,post,HttpClient三种方式向service提交文本数据
  • PCB原理图库
  • mysql相关故障
  • Win7 打开网页超级慢的解决方案
  • Android系统模拟器绘制实现概述
  • Codepen 每日精选(2018-3-25)
  • golang中接口赋值与方法集
  • javascript面向对象之创建对象
  • JavaScript学习总结——原型
  • js面向对象
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • TypeScript迭代器
  • vue总结
  • 高程读书笔记 第六章 面向对象程序设计
  • 欢迎参加第二届中国游戏开发者大会
  • 模型微调
  • 区块链分支循环
  • 微龛半导体获数千万Pre-A轮融资,投资方为国中创投 ...
  • # Swust 12th acm 邀请赛# [ A ] A+B problem [题解]
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • (k8s中)docker netty OOM问题记录
  • (poj1.2.1)1970(筛选法模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (八)五种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (实战篇)如何缓存数据
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • (转)程序员疫苗:代码注入
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .stream().map与.stream().flatMap的使用
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [ 转载 ] SharePoint 资料
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [383] 赎金信 js
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [acwing周赛复盘] 第 94 场周赛20230311
  • [AX]AX2012开发新特性-禁止表或者表字段
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)
  • [C#] 如何调用Python脚本程序
  • [C#][opencvsharp]opencvsharp sift和surf特征点匹配
  • [C/C++]数据结构 栈和队列()