当前位置: 首页 > news >正文

String、StringBuffer和StringBuilder

1,String:

是一个不可变的字符序列,一旦创建就不能修改。如果需要对字符串进行修改操作,实际上是创建了一个新的字符串对象。因此,在频繁修改字符串的情况下,使用String可能会导致性能问题和内存浪费。

2,StringBuffer:

是一个可变的字符序列,可以在原有对象的基础上进行修改。StringBuffer是线程安全的,因为它的方法大多是同步的。这意味着在多线程环境下,使用StringBuffer可以避免并发问题。但是,这也导致了StringBuffer的性能略低于StringBuilder,因为同步操作会带来额外的开销。

3,StringBuilder:

与StringBuffer类似,也是一个可变的字符序列。但StringBuilder不是线程安全的,因此它的性能比StringBuffer更高。在单线程环境下,推荐使用StringBuilder进行字符串操作。
总结:在不需要修改字符串的情况下,使用String;在多线程环境下,使用StringBuffer;在单线程环境下,使用StringBuilder。

缓冲区

StringBuffer 每次获取 toString 都会直接使用缓存区的 toStringCache 值来构造一个字符串。
StringBuilder 则每次都需要复制一次字符数组,再构造一个字符串。
所以, StringBuffer 对缓存区优化,不过 StringBuffer 的这个toString 方法仍然是同步的。

StringBuffer的缓冲区是一个可变字符序列,用于存储和管理字符串数据。
StringBuffer类是Java中提供的一个用于处理字符串的工具类,它内部使用了一个可自动扩容的数组来操作字符串数据。这个数组就是所谓的“缓冲区”,它是StringBuffer的核心部分,负责存储字符串的内容。
StringBuffer的缓冲区有以下特点:
可变性:与String不同,StringBuffer的缓冲区是可变的,这意味着可以在原有对象的基础上进行修改,而不需要每次都创建新的对象。
可扩展性:缓冲区的长度是可变的,随着字符串内容的增加,缓冲区会自动扩容以容纳更多的字符。
多操作支持:StringBuffer提供了多种方法来操作缓冲区中的字符串,如append()用于添加字符,insert()用于在指定位置插入字符等。
此外,StringBuffer的缓冲区还提供了一些其他有用的方法,例如capacity()用于获取当前缓冲区的容量,length()用于获取缓冲区中字符串的长度。
总之,StringBuffer的缓冲区是一个非常实用的功能,它使得在处理字符串时更加灵活和高效。通过使用StringBuffer,可以避免频繁创建新的字符串对象,从而
提高程序的性能。

StringBuffer的缓冲区大小是多少?

StringBuffer的默认初始容量(缓冲区大小)是16个字符。但是,不同的StringBuffer对象可以有不同的容量。如果使用的是无参构造器产生的对象,那么默认拥有16个字符长度的字符串缓冲区。如果是调参数为String的构造器,那么默认的字符串缓冲区容量是String对象的长度+16个长度的大小(留16个长度大小的空缓冲区)。当使用append或insert方法向源字符串追加内容的时候,如果内部缓冲区的大小不够,就会自动扩张容量。具体信息可查看AbstractStringBuilder源码。

如何使用 StringBuffer

要使用 StringBuffer,首先需要创建一个对象并为其分配初始缓冲区。可以使用多种方法来操作 StringBuffer,包括:

append():向缓冲区添加字符串或字符。
insert():在指定位置插入字符串或字符。
delete():从指定位置删除字符。
replace():替换缓冲区中的字符或字符串。
reverse():反转缓冲区中的字符。

下面是一个简单的示例,展示如何使用 StringBuffer:

import java.lang.StringBuffer;  
  
public class StringBufferExample {  
    public static void main(String[] args) {  
        // 创建一个初始为空的 StringBuffer 对象  
        StringBuffer sb = new StringBuffer();  
          
        // 使用 append() 方法添加字符串  
        sb.append("Hello, ");  
        sb.append("World!");  
        System.out.println(sb.toString());  // 输出 "Hello, World!"  
          
        // 使用 insert() 方法在指定位置插入字符串  
        sb.insert(7, ", ");  
        System.out.println(sb.toString());  // 输出 "Hello, , World!"  
          
        // 使用 delete() 方法删除字符  
        sb.delete(8, 11);  
        System.out.println(sb.toString());  // 输出 "Hello, World"  
          
        // 使用 replace() 方法替换字符或字符串  
        sb.replace(0, 5, "Hi");  
        System.out.println(sb.toString());  // 输出 "Hi, World"  
    }  
}

相关文章:

  • Log4j 输出日志到 TextArea JavaFX、Swing
  • 什么是okhttp?
  • 从0开始搭建若依微服务项目 RuoYi-Cloud(保姆式教程完结)
  • MongoDB基本使用
  • 爬虫学习笔记-selenium交互
  • (五)MySQL的备份及恢复
  • 【Linux】线程池的简易实现(懒汉模式)
  • Kotlin Multiplatform项目推荐 | 太空人分布图
  • 基于SpringBoot的高校社团管理系统
  • MySQL原理(二)存储引擎(1)概述
  • 伊恩·斯图尔特《改变世界的17个方程》毕达哥拉斯定理笔记
  • 前端怎么监听手机键盘是否弹起
  • 单片机如何实现延时1ms或者1us
  • Leetcode 2808 . 使循环数组所有元素相等
  • 《HTML 简易速速上手小册》第2章:HTML 的标签和元素(2024 最新版)
  • 【正点原子STM32】IWDG 独立看门狗(简介、工作原理、IWDG寄存器配置操作步骤、IWDG溢出时间计算、IWDG配置步骤、独立看门狗流程)
  • [网络安全]IIS---FTP服务器 、serverU详解
  • 技术科普 | 机器视觉5大关键技术及其常见应用
  • 空间数据分析和空间统计工具库PySAL入门
  • 三步实现 Sentinel-Nacos 持久化
  • 上海第四批土拍成交额97亿元:杨浦宅地成交楼板单价半年涨近7000元
  • 14岁女生瞒报年龄文身后洗不掉,法院判店铺承担六成责任
  • 欧盟委员会计划对950亿欧元美国进口产品采取反制措施
  • 加力、攻坚、借力、问效,上海为优化营商环境推出增量举措
  • 对话|蓬皮杜策展人布莱昂:抽象风景中的中国审美
  • 江淮、极氪、奇瑞,排着队造“劳斯莱斯”