Java之String、StringBuffer、StringBuilder

Java:String、StringBuffer和StringBuiler的区别
字符缓冲区,就是一个容器,容器中可以装很多字符。并且能够对其中的字符进行各种操作。

一、概念:
1、String
String字符串常量,字符串长度不可变。Java中String是immutable(不可变)的。

String类的包含如下定义:

private final char value[];
prinvate final int offset;
private final int count;

用于存放字符的数组被声明为final的,因此只能赋值一次,不可再更改。

2、StringBuffer
StringBuffer:字符串变量(Synchronized,即线程安全)。如果要频繁对字符串内容进行修改,出于效率考虑最好使用StringBuffer,如果想转成String类型,可以调用StringBuffer的toString()方法。

Java.lang.StringBuffer线程安全的可变字符序列。在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。可将字符串缓冲区安全地用于多个线程。

StringBuffer上的主要操作时append和insert方法,可重载这些方法,以接收任意类型的数据。每个方法都能有效地将给定的数据转换成字符串,然后将该字符串的字符追加或插入到字符串缓冲区。Append方法始终将这些字符添加到缓冲区的末端;而insert方法则在指定的点添加字符。

StringBuffer的特点:
(1)是一个字符串缓冲区,其实就是一个容器;
(2)长度是可变,任意类型都行。注意:是将任意数据都转成字符串进行存储;
(3)容器对象提供很多对容器中数据的操作功能,比如:添加、删除、查找、修改;
(4)所有的数据最终变成一个字符串。

创建一个字符串缓冲区对象。用于存储数据。

StringBuffer sb=new StringBuffer();

添加数据。不断的添加数据后,要对缓冲区的最后的数据进行操作,必须转成字符串才可以。

String str=sb.append(true).append(“hehe”).toString();
sb.append(“haha”);//添加字符串
sb.insert(2, "it");//在指定位置插入
sb.delete(1, 4);//删除
sb.replace(1, 4, "cast");

3、StringBuilder
StringBuilder:字符串变量(非线程安全)。在内部,StringBuilder对象被当作是一个包含字符串序列的变长数组。

Java.lang.StringBuilder是一个可变的字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步。该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。
在这里插入图片描述
二、三者的区别

三者的继承结构:
在这里插入图片描述

三者之前的区别:
(1)字符修改上的区别(主要)
String:不可变字符串;
StringBuffer:可变字符串、效率低、线程安全;
StringBuilder:可变字符序列、效率高、线程不安全;
(2)初始化上的区别,String可以空赋值,后者不行,报错;
(3)三者在执行速度方面的比较:
StringBuilder > StringBuffer > String
(StringBuilder , StringBuffer )>String的原因:
String:字符串常量;
StringBuffer:字符串变量;
StringBuilder:字符串变量。
从上面的名字可以看到,String是“字符串常量”,也就是不可改变的对象。
在这里插入图片描述

三、使用策略
(1)基本原则:如果要操作少量的数据,用String;单线程操作大量数据,用StringBuilder;多线程操作大量数据,用StringBuffer。
(2)不要使用String类的“+”来进行频繁的拼接,因为那样的性能极差,应该使用StringBuffer或StringBuilder类,这在Java的优化上是一条比较重要的原则。
(3)为了获得更好的性能,在构造StringBuffer或StringBuilder时应尽可能制定他们的容量。当然,如果你操作的字符串长度(length)不超过16个字符就不用了,当不指定容量(capacity)时默认构造一个容量为16的对象。不指定容量会显著减低性能。
(4)StringBuilder一般使用在方法内部来完成类似“+”功能,因为是线程不安全的,所有用完以后可以丢弃。StringBuffer主要用在全局变量中。
(5)相同情况下使用StringBuilder相比使用StringBuffer仅能获得10%~15%左右的性能提升,但却要冒多线程不安全的风险。而在现实的模块化编程中,负责某一模块的程序员不一定能清晰地判断该模块是否会放入多线程的环境中运行,因此:除非确定系统的瓶颈是在StringBuffer上,并且确定你的模块不会运行在多线程模式下,才可以采用StringBuilder;否则还是用StringBuffer。

简而言之:
(1)如果要操作少量的数据用String;
(2)多线程操作字符串缓冲区下操作大量数据StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据StringBuilder(推荐使用)。

参考文献:
https://blog.csdn.net/kingzone_2008/article/details/9220691
https://www.jianshu.com/p/9788bdeb2818

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值