String、StringBuffer、StringBuilder

本文详细探讨了Java中的String类,强调其不可变性以及内存中的表现。StringBuffer和StringBuilder作为可变的字符序列,分别提供了线程安全和非线程安全的字符串操作选项。在内存管理和多线程环境下,它们与String类的性能差异进行了对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

String

String类在Java中用来操作字符串。我们先来简单看一看String类的源码

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence 

我们发现,String类被声明为了final。表示String类不能被继承。

底层存储的数据结构:

 private final char value[];

底层使用char类型数组存储数据,该数据被final修饰,表示其一旦初始化,里面的是就不能再变了。所以这就导致了,每次对String的操作都会生成新的String对象,这样不仅效率低,而且还会浪费大量的空间。

举一个简单的例子:
String s7 = new String("abc");其在内存中的结构应为:

在这里插入图片描述
当我们将s7重新赋值s7 = "efg"时,此时s7并不指向0x123这个位置,而是重新指向了一个位置。

String的不可变性体现在:
        1、当对String类型的字符串进行拼接操作时,需要指定区域重新赋值,不能在原有的基础上进行修改
        2、当对字符串重新赋值以后,需要重新指定一个内存区域,不能在原有的基础上进行修改。
        3、当调用String的replace()方法时,也需要重新指定内存区域进行赋值。

String s1 = “abc” 和 String s1 = new String(“abc”)的区别

        String s1 = "abc"是通过字面量的方式给s1赋值,此时的字符串值声明在字符串常量池中,且字符串常量池中不会存储相同内容的字符串。

        String s1 = new String(“abc”)是通过new的方式,创建字符串对象的,此时会在堆中开辟一个空间存储一个地址值,该地址指向字符串常量池中的“abc”

StringBuffer

StringBuffer底层是创建了一个容量为16的char[]型数组。StringBuffer是可变的。且是线程安全的可变字符序列。
即StringBuffer每次对对象本身进行操作,不产生新的对象。StringBuffer是线程安全的
每个StringBuffer对象都有一定的缓冲区容量,当字符串大小没有超过容量时,不会分配新的容量,当字符串大小超过容量时,会自动增加容量

StringBuilder

StringBuilder和StringBuffer一样,都是可变字符序列,但是StringBuilder线程不安全。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值