String、StringBuffer、StringBuilder区别


1)String、StringBuffer、StringBuilder区别


  • String:String的值是不可变的,这就导致每次对String的操作都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间

  • StringBuffer:是可变类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量

  • StringBuilder:可变类,速度更快、线程不安全(不能同步访问)



字符串常量池在方法区中(本文是jdk1.7前编辑的,jdk1.7之后字符串常量池移至堆中)

使用包含变量的字符串连接符如"aa" + s1创建的对象是运行期才创建的,存储在heap中;只要s1是变量,不论s1指向池中的字符串对象还是堆中的字符串对象,运行期s1 + “aa”操作实际上是编译器创建了StringBuilder对象进行了append操作后通过toString()返回了一个字符串对象存在heap上。


对字符串进行修改的时候,特别是字符串对象经常改变的情况下,需要使用 StringBuffer 和 StringBuilder 类

由于 StringBuilder 相较于 StringBuffer 有速度优势,所以多数情况下建议使用 StringBuilder 类。

然而在应用程序要求线程安全的情况下,则必须使用 StringBuffer 类



参考链接:https://blog.csdn.net/itchuxuezhe_yang/article/details/89966303






2)String是用final修饰的,不可继承


通过阅读源码可以知道,String都是通过字符数组实现的。
其中string的字符数组是final修饰的,所以字符数组不可以修改。


上面第二句话的意思是:String类的所指向的字符数组不可修改,但是这个String的指向可以修改





3)为什么StringBuffer是final类型但值可以改变?String却不能改变?



  • final修饰的成员变量为基本数据类型时,赋值后无法改变。String中用一个final 的char数组private final char value[]

  • 当final修饰的为引用变量时,在赋值后其指向地址无法改变,但对象内容可以改变

  • String中用一个final 的char数组private final char value[];而StringBuffer对象的底层也是一个char[]数组,但是并没有用final修饰,所以数组的值是可变的。




4)String对象内存分配(常量池和堆):



https://www.bilibili.com/read/cv10202424/

https://baijiahao.baidu.com/s?id=1694462729201489422&wfr=spider&for=pc

https://blog.csdn.net/weixin_46286156/article/details/121905988

https://blog.csdn.net/weixin_45970271/article/details/124675457







posted @ 2022-03-24 20:06  卡卡发  阅读(47)  评论(0)    收藏  举报