文档章节

String,StringBuilder,StringBuffer三者的区别

时刻在奔跑
 时刻在奔跑
发布于 06/22 11:54
字数 921
阅读 18
收藏 0

这三个类之间的区别主要是在两个方面,即运行速度和线程安全这两方面。

首先说运行速度,或者说是,

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 StringBuilder stringBuilder=new StringBuilder().append("abc").append("de");
3 System.out.println(str);
4 System.out.println(stringBuilder.toString());

    这样输出结果也是“abcde”和“abcde”,但是String的速度却比StringBuilder的反应速度要快很多,这是因为第1行中的操作和

String str="abcde";

是完全一样的,所以会很快,而如果写成下面这种形式

1 String str1="abc";
2 String str2="de";
3 String str=str1+str2;

那么JVM就会像上面说的那样,不断的创建、回收对象来进行这个操作了。速度就会很慢。

2. 再来说线程安全

    在线程安全上,StringBuilder是线程不安全的,而StringBuffer是线程安全的

    如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

3. 总结一下

String:如果要操作少量的数据用 String ,这性能影响也不大。

StringBuilder:如果单线程下操作大量数据用 StringBuilder,单线程不用考虑线程安全问题,且这个速度快。

StringBuffer:如果是多线程操作字符串缓冲区下操作大量数据用 StringBuffer,速度稍慢点,但安全保障。

本文转载自:https://www.cnblogs.com/su-feng/p/6659064.html

共有 人打赏支持
时刻在奔跑
粉丝 0
博文 178
码字总数 64164
作品 0
安庆
私信 提问
Java深究之String、StringBuffer、StringBuilder的区别

在Java学习中,String、StringBuffer、StringBuilder三者是很重要的,在编写代码中经常使用到他们,那么深入的了解他们的异同是非常重要的,接下里我们详细剖析下这三个的异同之处 首先总结下...

MaxBill
07/02
0
0
[Java学习]Striing StringBuffer StringBuilder 的比

版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/u013132758。 https://blog.csdn.net/u013132758/article/details/52159425 最近发现对java中一些比较基础的东西掌握还是...

紫雾凌寒
2016/08/09
0
0
String StringBuilder StringBuffer三者的区别

运行速度:StringBuilder>StringBuffer>String String是常量,一旦创建不可更改,在代码中模拟是累加字符串,实际上是JVM回收该对象,并重创建对象来重新赋值(假象) String str="hello"; ...

恋码之子
09/29
0
0
Stringbuffer StringBuilder String

StringBuffer与String主要的区别是: 1.StingBuffer在进行字符串处理时不生成新的对象,但是String的每次修改都是产生新的对象,所以在内存上StringBuffer优于String 2.StirngBuffer只能通过...

战地春梦
2015/07/28
0
0
String StringBuffer StringBuilder区别

String 字符串类,常用来定义常量或者不需要动态扩展的变量,因为它是一个不可变的字符串数组, 如果要经常使用“+”来修改变量的值,每做一次 + 就产生个 StringBuilder 对象,然后 append...

特拉仔
2017/10/18
0
0

没有更多内容

加载失败,请刷新页面

加载更多

重构系统的套路-面向对象设计原则

前言 一讨论系统重构,很多人不明所以的就开始画各种架构图,写各种高可用,高并发设计方案,其实不知道很多系统的腐朽是从代码失控开始的,所以重构系统之前,架构师需要深谙面向对象设计之...

春哥大魔王的博客
6分钟前
1
0
Private Cloud和On-Premise区别

大家常常听到Private Cloud和On-Premise两个术语,下面通过相关背景介绍区分两者的差别: Private Cloud定义 维基百科云计算 词条中解释了Private Cloud,其含义为“Private cloud is cloud ...

突突突酱
7分钟前
0
0
Linux-ubuntu学习(第一天)

Linux第一天 1.Linux与Windows的区别 Windows是桌面OS。Linux是作为服务器的OS。Linux作为服务器是更安全更稳定的。 2.虚拟机的理解 学习java的时候有个java虚拟机JVM。如果想要在windows上运...

柠檬果过
18分钟前
0
0
以太坊应用开发接口:JSON RPC API

以太坊应用开发接口指的是以太坊节点软件提供的API接口,去中心化应用可以利用这个接口访问以太坊上的智能合约。以太坊应用开发接口采用JSON-PRC标准,通常是通过HTTP或websocket提供给应用程...

汇智网教程
27分钟前
3
0
排序--二分插入排序

二分插入排序是对直接插入排序的一个优化,在排序--直接插入排序中已经分析过直接插入排序的最坏时间复杂度是平方级别的,二分插入排序则是通过二分查找对寻找插入位置进行了优化,在找到插入...

FAT_mt
37分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部