String和StringBuilder的区别(final)?StringBuffer和StringBuilder的区别?

91 阅读2分钟

前言

相信大家对于string 已经stringbuild已经不陌生了,这两个都是可以创建一个字符串并对字符串进行操作,那么他俩之间有什么区别呢,今天我们就来简单的聊一聊。

操作字符串的三大类: 在java中提供三个类String StringBuillder StringBuffer来表示和操作字符串。字符串就是多个字符的集合。 String是内容不可变的字符串。String底层使用了一个不可变的字符数组(final char[])

image.png

String str =new String(“bbbb”);

而StringBuillder StringBuffer,是内容可以改变的字符串。StringBuillder StringBuffer底层使用的可变的字符数组(没有使用final来修饰)

image.png

最经典就是拼接字符串:

1、String进行拼接

String c = “a”+”b”;

2、StringBuilder或者StringBuffer

StringBuilder sb = new StringBuilder(); 
sb.apend(“a”).apend(“b”) 

拼接字符串不能使用String进行拼接,要使用StringBuilder或者StringBuffer

3.StringBuilder是线程不安全的,效率较高.而StringBuffer是线程安全的,效率较低。

为什么StringBuffer和StringBuilder的执行效率高:

String在java中是不可变长的,一旦初始化就不能修改长度,简单的字符串拼接其实是创建新的String对象,再把拼接后的内容赋值给新的对象,在频繁修改的情况下会频繁创建对象,而StringBuilder则不会,从头到尾只有一个实例对象。

那StringBuilder是怎么实现的呢?
StringBuilder在进行append方法连接字符串的时候并不是用String存储,而是存放到一个名为value的char[]数组当中,字符串是固定长度的,而数组是可以扩容的,因此就不需要在不停创建对象了。

StringBuffer和StringBuilder的比较:

  1. StringBuffer:线程安全; StringBuilder:线程不安全。

因为StringBuffer的所有公开方法都是synchronized修饰的,而StringBuilder并没有synchronized修饰。

  1. 缓冲区问题

StringBuffer每次获取toString都会直接使用缓存区的 toStringCache值来构造一个字符串。StringBuilde 则每次都需要复制一次字符数组,再构造一个字符串。所以说StringBuffer利用缓存区进行了部分优化操作。

  1. 性能问题

StringBuffer是线程安全的,它的所有公开方法都是同步的,而StringBuilder 是没有对方法加锁同步的,因此StringBuilder的性能要大于StringBuffer。