首先我们先来谈谈String:
String对象一旦创建,其值是不能修改的,如果要修改,会重新开辟内存空间来存储修改之后的对象,即修改了String的引用。
因为 String 的底层是用数组来存值的,数组长度不可改变这一特性导致了上述问题。
如果我们在实际开发过程中需要对某个字符串进行频繁的修改,使用 String 就会造成内存空间的浪费,应该怎样解决这个问题呢?
答案就是可以使用 StringBuffer 来解决这个问题。
下面我们就来详细谈谈StringBuffer:
StringBuffer 和 String 类似,底层也是用一个数组来存储字符串的值,并且数组的默认长度为 16,即一个空的 StringBuffer 对
象,数组长度为 16。实例化一个 StringBuffer 对象即创建了一个大小为 16 个字符的字符串缓冲区。
但是当我们调用有参构造函数创建一个 StringBuffer 对象时,数组长度就不再是 16 了,而是根据当前对象的值来决定数组的长
度,数组的长度为“当前对象的值的长度+16”。
所以一个 StringBuffer 创建完成之后,有 16 个字符的空间可以对其值进行修改。如果修改的值范围超出了 16 个字符,会先检查
StringBuffer 对象的原 char 数组的容量能不能装下新的字符串,如果装不下则会对 char 数组进行扩容。
那StringBuffer是怎样进行扩容的呢?
扩容的逻辑就是创建一个新的 char 数组,将现有容量扩大一倍再加上2,如果还是不够大则直接等于需要的容量大小。扩容
完成之后,将原数组的内容复制到新数组,最后将指针指向新的 char 数组。
接下来看StringBuffer的兄弟——StringBuilder
StringBuilder 和 StringBuffer 拥有同一个父类 AbstractStringBuilder,同时实现的接口也是完全一样,都实现了
java.io.Serializable, CharSequence 两个接口。
那它俩有什么区别呢?
最大的区别在于 StringBuffer 对几乎所有的方法都实现了同步,线程比较安全,在多线程系统中可以保证数据同步;
而StringBuilder 没有实现同步,线程不安全,在多线程系统中不能使用 StringBuilder。
StringBuffer 和StringBuilder 的使用场景:
当需要考虑线程安全的场景下使用 StringBuffer,如果不需要考虑线程安全,追求效率的场景下可以使用 StringBuilder。
以上是Java之String、StringBuffer和StringBuilder的区别和原理的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

安全考试浏览器
Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

WebStorm Mac版
好用的JavaScript开发工具

适用于 Eclipse 的 SAP NetWeaver 服务器适配器
将Eclipse与SAP NetWeaver应用服务器集成。

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

Atom编辑器mac版下载
最流行的的开源编辑器