String、StringBuilder、StringBuffer

String、StringBuilder、StringBuffer之间关系

String、StringBuilder、StringBuffer在java中都可进行对字符串的操作。

String:
在这里插入图片描述

被final修饰,不可继承修改
可以采用直接赋值的方式进行对象实例化,也可以通过构造方法完成。
String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间。
在这里插入图片描述如在此操作中每次拼接都会新创建一个String对象;从程序开始到结束共创建 “” ; “0” ;“01” ;…"012345678910…99"100个String对象,(字符串是一个常量,创建了就会存储字符串常量池)且在程序结束前不会自动释放,若在更多次数操作的情况下会导致浪费许多内存空间。
String:不可变性、简单,在多线程环境中不用考虑线程安全问题,缺点是频繁的变更String的值会造成内存的浪费

StringBuffer、StringBuilder:
StringBuffer、StringBuilder底层都是使用可修改数组实现的。初始构建时会分配一定长度n,当存储的值过长时,会自动使用arrayCopy实现扩容长度n,如果还不够,继续扩容长度n。

在这里插入图片描述在这里插入图片描述
StringBuffer:
StringBuffer是使用缓冲区的,本身也是操作字符串的,但与String类不同,String类中的内容一旦声明之后不可改变,改变的只是其内存地址的指向,而StringBuffer中的内容是可以改变的 。StringBuffer初始构建时会分配一定长度n,当存储的值过长时,会自动使用arrayCopy实现扩容长度n,如果还不够,继续扩容长度n。
对于StringBuffer而言,本身是一个具体的操作类,所以不能像String那样采用直接赋值的方式进行对象实例化,必须通过构造方法完成。
初始化StringBuffer是线程安全的(支持同步事物锁),所以速度比StringBuilder差一点。

StringBuilder:
StringBuilder是一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候;与StringBuffer相同初始构建时会分配一定长度n,当存储的值过长时,会自动使用arrayCopy实现扩容长度n,如果还不够,继续扩容长度n。必须通过构造方法完成实例化。
在这里插入图片描述StringBuilder性能速度优于StringBuffer,但线程不安全。

总结:

速度方面正常情况下(由快到慢):StringBuilder>StringBuffer>String

区别一:
String在修改时不会改变对象自身
在每次对String类型进行改变时候其实都等于生成了一个新的String对象并指向新对象,且旧对象不会自动释放,使用时会产生大大量垃圾,浪费内存空间。
StringBuffer、StringBuilder在修改时会改变对象自身
每次修改都会对StringBuffer对象本身进行操作,不是生成新的对象。

区别二:
StringBuffer:线程安全(支持同步事物锁);适用于多线程操作字符串缓冲区下操作大量数据。
StringBuilder:线程不安全;单线程操作字符缓冲区下操作大量数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值