string ,stringbuffer ,stringbuilder演进及使用场景和解决的问题

Posted 似水流年,是谁苍白了等待

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了string ,stringbuffer ,stringbuilder演进及使用场景和解决的问题相关的知识,希望对你有一定的参考价值。

目录

前言:

一、出现顺序

String

StringBuffer

StringBuilder

二、string/stringbuffer和stringbuilder演进

1.String

a.概述

b.适用场景:

2.StringBuffer

a.概述

b.适用场景

3.StringBuilder

a.概述

b.适用场景



前言:

最近在学习的时候对比了String,StringBuffer,StringBuilder的区别,但是不清楚他们是怎么来的,为什么有了String还会有StringBuffer和StringBuilder,以及它们都解决了什么问题?。所以通过看源码版本号,注释等可以了解等他们的详情:

一、出现顺序

通过三张图对比他们的前世今生

String

StringBuffer

StringBuilder

二、string/stringbuffer和stringbuilder演进

1.String

a.概述

  • String类被声明为不可变类,用final修饰,被声明为final class ,所有的属性也是用final修饰,也表明这个类不能被继承。
  • String不可变的第二点是,用来存储字符串的char value[]数组被private和final修饰,当一个被final修饰的基本数据类型的变量,则其数值一旦在初始化之后便不能更改。

b.适用场景:

用到的字符串经常不会变动

可以看见被final修饰

2.StringBuffer

a.概述

        因此他的对象是不可变的,在每次创建对象,字符串拼接都会产生新的对象,如果操作频繁或者创建的对象很多,效率就很差,容易导致内存溢出,因此为了解决这种问题,产生了StringBuffer,每次产生的新对象都是以追加的方式产生对象,不会重新创建已经创建过的对象,在原来的有序序列末尾或者指定位置添加,提供了append和insert方法。

         但是StringBuffer的很多方法都用synchronized修饰,他是一个线程安全的可修改的字符序列,它保证了线程安全,那么相应的效率也就会降低,会在添加字符的时候带来额外的性能开销,如果是不考虑线程安全用它效率就比较差了。

b.适用场景

在频繁进行字符串运算(如拼接、替换、删除等),并且运行在多线程环境中,则可以考虑使用StringBuffer

StringBuffer方法加上了synchronized

3.StringBuilder

a.概述

         所以为了解决效率差,在java1.5提出了StringBuilder,功能和StringBuffer没有本质区别,就是将方法上的synchronized去掉了,在增加字符序列,字符拼接的时候极大提高了效率。

b.适用场景

        在频繁进行字符串运算(如拼接、替换、和删除等),并且运行在单线程的环境中

如下图:

StringBuilder的方法去掉了synchronized关键字。

 

 

以上是关于string ,stringbuffer ,stringbuilder演进及使用场景和解决的问题的主要内容,如果未能解决你的问题,请参考以下文章

String/StringBuilder/StringBuffer

String,StringBuffer,StringBuilder效率优先关系说明

string和stringbuffer的执行速度

Java基础之String,StringBuilder,StringBuffer

从为什么String=String谈到StringBuilder和StringBuffer

java中String StringBuilder 和 StringBuffer的联系与区别