【Java】Java中String、StringBuilder、StringBuffer三者的区别
这三个类之间的区别主要是在两个方面(运行速度和线程安全)这两方面。
1. 首先说运行速度,或者说是执行速度,在这方面运行速度快慢为: StringBuilder >StringBuffer > String
String最慢的原因:
String为字符串常量,而StringBuilder和StringBuffer均为字符串变量,即String对象一旦创建之后该对象是不可更改的,但后两者的对象是变量,是可以更改的。比如:
1. String str="abc";
2 .System.out.println(str);
3 .str=str+"de";
4. System.out.println(str);
如果运行这段代码会发现先输出“abc”,然后又输出“abcde”,好像是str这个对象被更改了,其实,这只是一种假象罢了,JVM对于这几行代码是这样处理的,首先创建一个String对象str,并把“abc”赋值给str,然后在第三行中,其实JVM又创建了一个新的对象也名为str,然后再把原来的str的值和“de”加起来再赋值给新的str,而原来的str就会被JVM的垃圾回收机制(GC)给回收掉了,所以,str实际上并没有被更改,也就是前面说的String对象一旦创建之后就不可更改了。所以,Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢。
而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
有时候我们会这样对字符串进行赋值:
1. String str="abc"+"de";
2. StringBuilderstringBuilder=
newStringBuilder().append("abc").append("de");
3. System.out.println(str);
4.System.out.println(stringBuilder.toString());//将对象转化为字符串,并返回结果;
long startTime=System.nanoTime(); //获取开始时间
String str="abc"+"de";
long endTime=System.nanoTime(); //获取结束时间
System.out.println(str);
System.out.println("程序运行时间:"+(endTime-startTime)+"ns");
long startTime1=System.nanoTime(); //获取开始时间
StringBuilder stringBuilder=newStringBuilder().append("abc").append("de");
long endTime1=System.nanoTime(); //获取结束时间
System.out.println(stringBuilder.toString());
System.out.println("程序运行时间:"+(endTime1-startTime1)+"ns");
这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和 Stringstr="abcde";
是完全一样的,所以会很快,而如果写成下面这种形式
1 String str1="abc";
2 String str2="de";
3 String str=str1+str2;
long startTime1=System.nanoTime(); //获取开始时间
String str1="abc";
String str2="de";
String str=str1+str2;
long endTime1=System.nanoTime(); //获取结束时间
System.out.println(str);
System.out.println("程序运行时间:"+(endTime1-startTime1)+"ns");
那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。
2. 线程安全
在大部分情况下 StringBuffer > String
StringBuffer:
Java.lang.StringBuffer线程安全的可变字符序列。一个类似于String的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。
可将字符串缓冲区安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
StringBuilder 上的主要操作是 append 和 insert 方法,可重载这些方法,以接受任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区中。append 方法始终将这些字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符。
例如,如果 z 引用一个当前内容是“start”的字符串缓冲区对象,则此方法调用 z.append("le") 会使字符串缓冲区包含“startle”,而 z.insert(4, "le") 将更改字符串缓冲区,使之包含“starlet”。
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilder:
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
总结:
String:适用于少量的字符串操作的情况
StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
【Java】Java中String、StringBuilder、StringBuffer三者的区别相关推荐
- java中拼接和 的区别_浅析Java中String与StringBuffer拼接的区别
学习笔记: 1.String拼接会创建一个新的String对象,存储拼接后的字符串: StringBuffer拼接是直接在本身拼接,会即时刷新. 2.String只能拼接String类型的字符串: S ...
- String StringBuilder StringBuffer三者之间的区别~~~
String StringBuilder StringBuffer三者之间的区别~~~ String是字符串常量,它是典型的immutable类,被声明final class,所有的属性都是fina ...
- String,Stringbuilder,Stringbuffer及正则表达式
掌握String StringBuilder StringBuffer类的区别 一.String String是不可变类,一旦String对象被创建之后,包含对象中的字符串序列都是不可改变的,直到类被 ...
- String , StringBuilder , StringBuffer
String 首先从String底层看起 从底层代码被final修饰,我们能看出来,String是只读字符串,他的成员方法也都默认为final方法.所以String所引用的字符串内容不能被改变 Str ...
- Java:中的String,StringBuilder,StringBuffer三者的区别
Java中的String,StringBuilder,StringBuffer三者的区别 最近在学习Java的时候,遇到了这样一个问题,就是String,StringBuilder以及StringBu ...
- Java基础之String,StringBuilder,StringBuffer三者的区别
Java基础之String,StringBuilder,StringBuffer三者的区别 目录 运行速度方面 线程安全方面 小结 1. 运行速度方面 运行速度,在这方面运行速度快慢为:StringB ...
- Java中String、StringBuffer、StringBuilder的区别
Java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- Java基础知识(JAVA中String、StringBuffer、StringBuilder类的区别)
java中String.StringBuffer.StringBuilder是编程中经常使用的字符串类,他们之间的区别也是经常在面试中会问到的问题.现在总结一下,看看他们的不同与相同. 1.可变与不可 ...
- [JAVA基础类库] String类 ○ StringBuffer类 ○ StringBuilder类
引言 字符串就是一连串的字符序列,Java提供了String.StringBuffer和StringBuilder三个类来封装对字符串,并提供了系列方法来操作字符串对象. String类是不可变类的: ...
- Java 集合 --- String, StringBuilder, StringBuffer
Java 集合 --- String, StringBuilder, StringBuffer String String的声明方式 String的不可变性 对比两个String StringBuil ...
最新文章
- 2019微软研究大盘点:机器学习突破即将到来,人机交互更加真实
- PostgreSQL在何处处理 sql查询之五十二
- android表视图,android – 列表视图与表格布局
- CodeForcesGym 100753B Bounty Hunter II 二分图最小路径覆盖
- libgdx学习记录18——Box2d物理引擎
- 十二天深入理解计算机系统(一)
- android studio代码对齐的快捷键
- 力扣—— 224. 基本计算器(困难)
- 无监督/自监督/半监督的景物分割方法
- sublime能编译PHP吗,让sublime编译php、js
- 《数字图像处理与机器视觉——Visual C++与Matlab实现》——0.1 数字图像
- 计算机二级C语言题库(44套真题+刷题软件)第一套
- nankai 2082: 靶形数独 数独(9*9)求所有解 DLX+精确覆盖
- Junit 4 与Junit 5区别
- cocos2dx lua转luac的问题(32位与64位不兼容问题)
- 生活之游戏中的心理学
- 坐标轴范围及刻度的自适应算法
- 【Azure 应用服务】App Service 开启了私有终结点(Private Endpoint)模式后,如何来实现公网Git部署呢?
- 2022-09-08 mysql/stonedb-慢SQL-出现问题的SQL-Q2
- fgetc php,php fgetc函数怎么用
热门文章
- flask send_filesend_from_directory
- vSAN一次人肉工程师踩过的坑
- 微服务架构开发实战:如何实现微服务的自动扩展?
- RedHat Linux和Cent Linux日常运维之安全加固详细篇
- android log 码率,webrtc之Android视频质量提升:保帧率降码率
- 怎么读取瑞萨mcu的 checksum_为物联网设备选择一颗“安全”的MCU
- 材料凝固计算机模拟,颗粒增强金属基复合材料凝固过程的计算机模拟_谢国宏.pdf...
- SpringBoot | 第三十五章:Mybatis的集成和使用
- [LeetCode] Valid Anagram
- (转)Clang 比 GCC 编译器好在哪里?