> 文档中心 > String、StringBuffer、StringBuilder

String、StringBuffer、StringBuilder


我宁愿写bug⚠️,也不愿什么都不做 ❗️

💚哈喽!大家好!💚

❤️我是 一看就会,一写就废浩浩🔍❤️

💙让我带你编程带你飞,带你飞进垃圾堆!💙

💜 如果对你有所帮助,请给我点个赞👍!💜

键盘敲烂💥,工资过万💰


文章目录

💛1. String
💙2. StringBuffer
💜3. StringBuilder
❤️4. String、StringBuffer、StringBuilder 区别


1. String
  • String是被final修饰的类,不能被继承。
  • String底层是通过char类型的数据实现的。
  • String类,因为它被final修饰,所以是不可变的类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可变的,直到这个对象被销毁。

看到这里有的同学就要问了

String s = "abc";s = "def";System.out.println(s);/*def*/

这不明明就是修改了吗?怎么还说它不可变呢?

我们从底层去分析,我们每次对String的赋值都是改变它的堆内存的地址指向。也就是说,我们每次对String的赋值都会创建新的String对象,占用新的堆内存空间。

在这里插入图片描述

当我们经常性的对字符串操作就会极大浪费内存空间,为了避免对内存空间的浪费,我们就可以使用StringBuffer类、和StringBuilder类

2. StringBuffer
  • StringBuffer类,称为字符串缓冲区;所表示的也是一个字符序列;这个类型必须用new创建对象,和String相反,它是可变的类
  • StringBuffer对象则代表一个字符序列可以改变的字符串,当StringBuffer被创建以后,通过StringBuilder提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串的字符序列
StringBuffer s = new StringBuffer("abc");s.append("def");System.out.println(s);/*abcdef*/

我们再分析以上代码的底层逻辑
在这里插入图片描述

我们可以看到,StringBuffer对象是一个字符串序列可变的字符串,它没有重新生成一个对象,而是在原来的基础上对字符串进行修改。

3. StringBuilder
  • StringBuilder类,与StringBuffer兼容,使用方法基本类似,但是不保证线程安全

4. String、StringBuffer、StringBuilder 区别
  • String类是不可变的,对象一旦被创建,就不能被修改;可以使用 = 直接赋值,此时使用常量池;也可以使用new创建,不使用常量池;

  • StringBuffer是可变的,对象创建后,可以修改;必须使用new关键字,是线程安全的;

  • StringBuilder是不保证线程安全的,在单线程情况下使用比StringBuffer高效;必须使用new关键字