Java中StringBuilder和StringBuffer用法以及区别

2023-11-02

Java是目前最为流行的编程语言之一,而字符串则是Java程序中不可避免的部分。在字符串的处理中有两个类:StringBuilder和StringBuffer,这两个类都实现了对可变字符串的操作,在一定程度上可以替代String的功能。但它们之间也存在一些区别,下面我们就来详细介绍一下它们的用法和区别。

一、StringBuilder和StringBuffer的基础知识

StringBuilder和StringBuffer都是Java中对可变字符串的处理的类。Java中的字符串都是不可变的,即它们一旦创建就不能被改变,所有对字符串的操作都会生成一个新的字符串对象。这样,当我们需要对字符串进行频繁操作时就会带来很大的效率问题。

那么,StringBuilder和StringBuffer的作用就在于,它们提供了对字符串的可变操作,可以避免生成大量的字符串对象,提高了程序效率。

StringBuilder和StringBuffer的基本用法差不多,二者都有以下方法:

append:在字符串末尾添加内容
insert:在指定位置插入内容
delete:删除指定位置的字符
deleteCharAt:删除指定位置的字符
replace:替换指定位置的字符
substring:截取子串
indexOf:查找指定字符串位置
lastIndexOf:查找最后一次出现的指定字符串位置
length:获取当前字符串长度
setLength:设置字符串长度

二、StringBuilder和StringBuffer的区别

虽然StringBuilder和StringBuffer功能相似,但在使用中还是有一些区别的。下面我们来具体看一下。

1.线程安全

StringBuilder是非线程安全的,而StringBuffer是线程安全的。它们在实现上有所不同。

StringBuffer所有的方法都加了synchronized关键字修饰,保证了多个线程同时访问StringBuffer时不会产生数据的安全问题。而StringBuilder没有加synchronized关键字修饰,因此很可能在多线程的环境下会出现数据的竞争和不相干的结果。

2.效率

考虑到线程安全机制会带来额外的开销,StringBuffer的执行效率比StringBuilder要低。特别是当需要进行频繁的字符串操作时,使用StringBuilder会更加高效。

3.容量增长

StringBuilder和StringBuffer在扩充容量(即添加字符超过原来设定的长度时)的方法上也有所不同。

StringBuffer在容量不足以附加新内容时,会自动扩展容量的大小。默认情况下,容量会增加原来的2倍+2,例如:原来的容量为16,当容量不够时,则将容量扩充为34。

StringBuilder在容量不足以附加新内容时,会按照一定的规则(4个字符扩容一次)增容量,直到容量足够为止。

容量增长的方式不同,导致了StringBuilder比StringBuffer要稍微快一些。

三、示例代码

下面我们来通过一些实例来看一下StringBuilder和StringBuffer的用法以及效率差异。

首先是一个使用StringBuilder的示例:

long startTime = System.currentTimeMillis();

StringBuilder stringBuilder = new StringBuilder();

for (int i = 0; i < 100000; i++) {
  stringBuilder.append(i);
}

String result = stringBuilder.toString();

long endTime = System.currentTimeMillis();

System.out.println("time: " + (endTime - startTime) + "ms");

这个程序会生成一个长度为100000的字符串。我们可以分别测试使用StringBuilder和StringBuffer时的字符串生成速度,代码如下:

long startTime = System.currentTimeMillis();

StringBuffer stringBuffer = new StringBuffer();

for (int i = 0; i < 100000; i++) {
  stringBuffer.append(i);
}

String result = stringBuffer.toString();

long endTime = System.currentTimeMillis();

System.out.println("time: " + (endTime - startTime) + "ms");

运行这两个程序,我们得到的时间分别为:

使用StringBuilder:time: 3ms
使用StringBuffer:time: 4ms

从结果可以看出,使用StringBuilder所需时间比使用StringBuffer要少,效率也更高。

四、总结

在Java中,处理字符串需要用到String、StringBuilder和StringBuffer。尽管使用上都很容易,但大家应该从上述细节中清楚地知道其中的区别。如果在单线程的情况下,建议使用StringBuilder;在多线程的情况下,建议使用StringBuffer。

当然,在实际开发中,可能会遇到使用StringBuffer和StringBuilder之外的其他类的情况,因为它们可以通过缓存机制来避免字符串频繁创建的问题。但无论使用哪种方式,都应该注意字符串生成的效率问题,以便在程序运行时有更高的性能表现。

本文由mdnice多平台发布

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中StringBuilder和StringBuffer用法以及区别 的相关文章

  • 遍历磁盘根目录

    for char i A i lt Z i 遍历所有磁盘 char dir 20 i 组成磁盘名称 char path 100 定义文件路径 UINT type GetDriveType dir 获取磁盘类型 if type DRIVE F
  • 网络与信息安全基础知识--网络安全

    说在前面 本系列文章专注于软考备考复习内容梳理 文章内容是对教材中知识点和考点的提炼 备考过程中可以有针对的进行复习 减少阅读量 有的放矢 导航目录 一 网络安全概述 二 网络的信息安全 1 信息的存储安全 2 信息的传输安全 三 防火墙技
  • Mac安装Netcat教程

    Netcat可以用于测试通信连接 Mac安装Netcat方式 打开终端输入 brew install netcat 安装好以后测试 输入 nc 可以看到是这样的 itzhuzhu itzhuzhudeMacBook Pro brew ins

随机推荐

  • 五、【服务器】基本概念-1

    服务器标准 ATCA AdvancedTelecom Computing Architecture 国际标准 ATCA脱胎于在电信 航天 工业控制 医疗器械 智能交通 军事装备等领域应用广泛的新一代主流工业计算技术 CompactPCI标准
  • 网络系统实现技术之IPX与SPX

    IPX SPX Novell NetWare网络 Novell公司为适应网络发展 将主机网络转换为PC网络 开发了Novell NetWare网络系统 该系统中基于客户机 服务器模式 以普通PC机做为客户机 以性能强大的服务器做为服务器 为
  • 什么是算法?

    什么是算法 当人们提到 算法 一词 往往就会把它们当成专属于 人工智能 的范畴 很多专业的计算机人士也是 提起算法就头疼 不知道如何学习算法 慢慢的对算法就会失去兴趣 算法不仅仅是计算机行业特有的 在我们的生活中也处处存在着算法 算法是专注
  • 【积跬步以至千里】Windows无法访问指定设备,路径或文件,您可能没有合适的权限访问

    一 问题描述 今天在使用电脑时突然出现如下状况 然后我打开用户权限发现了原来是权限的问题 我点击编辑 依然不管事 那怎么处理呢 二 解决办法 1 方法一 单独设置 1 在无法打开的文件 文件夹上单击鼠标右键 选择 属性 2 切换到 安全 选
  • __int64、ULONGLONG格式化输出

    Tips 打印日志信息的时候出现的问题 虽然很小 也算提个醒 Code 不考虑溢出的情况 ULONGLONG n1 100 printf d n n1 int64 n2 100 printf d n n2 此处是个坑 printf d d
  • 华为推出手机系统云翻新服务:什么是云翻新?如何使用?

    华为手机系统云翻新是华为推出的一项功能 旨在通过云服务提供系统翻新的服务 它可以帮助用户对手机的系统进行优化和更新 以提高手机的性能和流畅度 具体而言 华为手机系统云翻新功能提供了免费的云空间 用户可以将手机中的系统数据备份到云端 并进行系
  • 一位程序员使用M1 Mac的感受

    作为一个window的java开发者 虽然现在window高配置不卡 但是身边的高级开发者都是使用苹果开发 并且给予高度评价 这里也抱着学习的态度去尝试安利一台MAC作为开发 所以去苹果官网看了一下 但是这次苹果出了一个全新的M1芯片 我在
  • STM32网络通信Web Server中SSI和CGI的应用

    介绍 最近由于项目功能需要 开始研究STM32 WebServer通信以及SSI和CGI应用方法 项目结束后 主要总结浏览器与STM32之间进行通行 STM32作为服务器而浏览器做为客户端进行通行 文件介绍 此部分的代码是根据ST官方的We
  • 免费分享一套 SpringBoot + Vue的排课/选课管理系统,挺漂亮的

    大家好 我是锋哥 看到一个不错的SpringBoot Vue 的排课 选课管理系统 分享下哈 项目介绍 近年来 随着网络学校规模的逐渐增大 人工书写数据已经不能够处理如此庞大的数据 为了更好的适应信息时代的高效性 一个利用计算机来实现学生信
  • Python——requests

    requests是python实现的简单易用的HTTP库 使用起来比urllib简洁很多 因为是第三方库 所以使用前需要cmd安装 pip install requests 安装完成后import一下 正常则说明可以开始使用了 基本用法 r
  • c/c++ 计算字符数组/字符串长度

    1 自定义函数求长度 2 使用strlen 函数 3 使用sizeof 操作符 4 使用length 函数 利用自定义函数的方法 int cont str char s int i 0 while str i 0 return i 利用st
  • 已解决【partially initialized module ‘cv2‘ has no attribute ‘gapi_wip_gst_GStreamerPipeline‘】

    已解决 partially initialized module cv2 has no attribute gapi wip gst GStreamerPipeline 在尝试了几乎所有网上能找到的办法之后 本来已经放弃了 但是过了几天抱着
  • VAN:Visual Attention Network

    Visual Attention Network Submitted on 20 Feb 2022 v1 last revised 11 Jul 2022 this version v5 Computer Vision and Patter
  • 微服务zipkin与turbine同时使用遇到的问题

    最近整合zipkin的时候遇到的问题 如果打开turbine监控时 每个turbine刷新周期内都会有rxjava的调用被zipkin捕获到 由于zipkin中的数据是通过Spring cloud sleuth上传的 查阅https clo
  • 数字化转型下数据库面临的12个挑战

    数字化及数字化转型 是近些年来非常火热的话题 本文将从这一角度切入 谈谈数字化场景下对数据库发展趋势带来的影响 1 数据 数字化 数字化转型 数据 是数字化实现的新引擎 数据是企业开展数字化创新和构建企业数字化基因的核心要素 通过对于服务对
  • React--井字棋小游戏

    安装较新版本的node js 这里使用的是v15 0 1 用以记录React学习笔记 1 搭建本地开发环境 在想要创建项目的文件夹下输入cmd 回车 输入命令npx create react app my app等待项目初始化 等待一段时间
  • 【虾说区块链】4个概念解析区块链

    欢迎收听 虾说区块链 现在区块链这个概念在互联网上相当火热 这里简单做一个普及 不涉及项目推广投资 单纯地对区块链相关基础知识概念作一个说明讲解 本人区块链技术爱好者 结合相关区块链资料总结整理了 虾说区块链 也是自己一个学习笔记 涉及相关
  • 深入React源码揭开渲染更新流程的面纱

    转前端一年半了 平时接触最多的框架就是React 在熟悉了其用法之后 避免不了想深入了解其实现原理 网上相关源码分析的文章挺多的 但是总感觉不如自己阅读理解来得深刻 于是话了几个周末去了解了一下常用的流程 也是通过这篇文章将自己的个人理解分
  • java入门篇

    MyEclipse 8 5编辑器 package second public class test public static void main String args 单行注释System out println java practi
  • Java中StringBuilder和StringBuffer用法以及区别

    Java是目前最为流行的编程语言之一 而字符串则是Java程序中不可避免的部分 在字符串的处理中有两个类 StringBuilder和StringBuffer 这两个类都实现了对可变字符串的操作 在一定程度上可以替代String的功能 但它