String、StringBuffer、StringBuilder的特性及区别

String

String是Java提供的用来处理字符串相关的一个类,并不是基本数据类型,
在这里插入图片描述
在jdk8的源码中可以看出String是final修饰的,就是说String不可以被继承,
底层实现的char数组也是final修饰,表示一个字符串创建以后,是不可以改变的(char指向的内存地址不可变),被存储在字符串常量池中,不可变,不适合频繁进行字符串拼接操作。

StringBuffer

在这里插入图片描述
可以看出StringBuffer同样是final修饰的,不同的是,其实现的char数组并没有用final修饰,意味着Stringbuffer对象可以改变;

transient:将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会被序列化

在来看StringBuffer的无参构造:
在这里插入图片描述
进入StringBuffer的父类
在这里插入图片描述
StringBuffer和StringBuilder都继承了AbstractStringBuilder这个抽象类,如果使用无参构造来创建一个StringBuffer对象那么它的初始长度是16;StringBuilder同样,如图:
在这里插入图片描述

Stringbuilder

Stringbuilder和StringBuffer的方法几乎一样
在这里插入图片描述
区别是,StringBuilder,的效率比StringBuffer的效率高:
StringBuilder:
在这里插入图片描述
StringBuffer:
在这里插入图片描述
StringBuffer的很多方法都加上了同步关键字,保证线程安全 ,线程安全带来的问题是,效率!

关于可变字符对象的扩容:
在这里插入图片描述
将源数组长度左移一位在加二,左移一位相当与乘2,源数组的长度是16,扩容后的数组长度是34;

优化:在创建可变字符串时尽可能给一个符合实际的较大的初始长度,减少底层的数组扩容

使用场景:

1.如果要操作少量的数据用 = String
2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值