java——String,StringBuilder,StringBuffer的比较和选择

一、 String

String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低

1、String 有属性 private final char value[]; 用于存放字符串内容

2、value 是一个 final 类型: value 【本质是char数组】不能指向新的地址,但是单个字符内容是可以变化

1、创建 String 对象的两种方式

1)方式一:直接赋值String s="hello";

2)方式二:调用构造器 String s=new String("hello");

2、两种创建 String 对象的区别

1、方式一:先从常量池查看是否有"hello"数据空间,如果有,直接指向;如果没有则重新创建,然后指向。s最终指向的是常量池的空间地址

2、方式二:先在中创建空间,里面维护了value属性,指向常量池的hello空间。如果常量池没有"hello",重新创建;如果有,直接通过valu指向。s最终指向的是堆中的空间地址。


二、StringBuffer

StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址,效率较高

1、 StringBuffer 的直接父类 是 AbstractStringBuilder

2、在父类中 AbstractStringBuilder 有属性 char[] value,不是 final该 value 数组存放字符串内容,存放在堆中的

3、因为 StringBuffer 字符内容是存在 char[] value, 所有在变化(增加/删除)不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String


三、StringBilder

1、一个可变的字符序列。此类提供一个与StringBuffer 兼容的API,但不保证同步(StringBuilder线程不安全)。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer 要快。

2、在 StringBuilder上的主要操作是 append 和insert 方法,可重载这些方法,以接受任意类型的数据。


四、String、StringBuffer 、 StringBuilder 的比较

1、类图

2、比较 

字符序列

效率

线程安全性
String不可变效率低线程安全
StringBuffer可变效率较高(增删)线程安全
StringBuilder可变效率最高线程不安全


五、 String、StringBuffer 和 StringBuilder 的选择

1、如果字符串存在大量的修改操作,一般使用 StringBuffer 或 StringBuilder

2、如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder

3、如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer

4、如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等


备注:

以上若有明显错误的地方,可以私信我哦,谢谢~

  • 18
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值