【Java从零开始再学习 06】java中String、StringBuffer、StringBuilder的区别

84 阅读2分钟

「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」。

java中String、StringBuffer、StringBuilder的区别

可变与不可变

首先String类型是一个不可变的字符串,StringBuffer和StringBuilder是可变字符串。接下来我们在详细理解一下什么是可变什么是不可变。

不可变字符串:在String类型中无法对字符串中的内容进行更改,如果更改了的话其实它指向了另一个更改后形成的字符串的地址。

如图

截屏2022-02-10 下午11.04.27

可变字符串:StringBuffer和StringBuilder可变字符串的底层原理是数组的改变。StringBuffer、StringBuilder在堆中存在两个值一个是value一个是count。value存放的是字符数组的地址,count是记录数组中存放字符的个数。如果在StringBuffer和StringBuilder类型中增加字符会在原来的字符数组尾部进行添加。而不会重新开启一个新的字符串数组。如果要开启新的字符串数组,就要count所记录的数字大于数组长度,这个时候就会创建一个更长的新字符数组然后把旧数组内内容拷贝到新数组中,再把value值指向新的数组。

截屏2022-02-10 下午11.31.32

效率和线程安全

  1. StringBuffer和StringBuilder比String效率要更高。因为String是不可变的在改变字符串时会涉及到字符串的创建和回收,这样以来StringBuffer和StringBuilder就会比String效率要高
  2. StringBuilder比StringBuffer的效率要高。因为StringBuilder是作用于单线程的,没有考虑线程同步所造成的竞态条件。在方法上没有加上synchronized隐式锁。所以效率会更高
  3. StringBuilder线程不安全。因为没有加上锁,所以StringBuilder不适合在多线程环境下使用。这个是一大弊端。