StringBuffer与StringBuilder 2024-8-21 22-13
目录
- 一、StringBuffer
- 二、StringBuilder
- 三、总结
一、StringBuffer
StringBuffer是一个可变的字符序列,它的存在是为了解决频繁操作字符串时产生大量临时对象的问题。
-
构造方法:
StringBuffer():创建一个空的字符串缓冲区,初始容量为 16 个字符。StringBuffer(int capacity):创建一个空的字符串缓冲区,具有指定的初始容量。StringBuffer(String str):创建一个字符串缓冲区,并将其初始内容设置为指定的字符串。
-
常用方法:
append():将指定的参数追加到字符串缓冲区的末尾。可以接受各种数据类型的参数,如基本数据类型、字符串、对象等。例如:StringBuffer sb = new StringBuffer("Hello"); sb.append(" World!"); System.out.println(sb); // 输出:Hello World!insert():在指定位置插入指定的参数。例如:StringBuffer sb = new StringBuffer("Hello"); sb.insert(2, "abc"); System.out.println(sb); // 输出:Heabcllodelete():删除指定范围内的字符。例如:StringBuffer sb = new StringBuffer("Hello World!"); sb.delete(5, 11);//左闭右开 System.out.println(sb); // 输出:Hello!reverse():将字符串缓冲区中的字符序列反转。例如:StringBuffer sb = new StringBuffer("Hello"); sb.reverse(); System.out.println(sb); // 输出:olleHlength():返回字符串缓冲区的长度。capacity():返回当前字符串缓冲区的容量。如果需要的字符数量超过当前容量,StringBuffer会自动增加容量。
-
线程安全性:
StringBuffer是线程安全的,这意味着多个线程可以同时访问和操作同一个StringBuffer对象,而不会出现数据不一致的情况。这是通过在方法上进行同步实现的。例如:
class ThreadSafeExample {public static void main(String[] args) {// 创建一个空的 StringBuffer 对象 sharedBufferStringBuffer sharedBuffer = new StringBuffer();// 创建第一个线程 thread1Thread thread1 = new Thread(() -> {// 在这个线程中,循环 1000 次向 sharedBuffer 中追加字符'A'for (int i = 0; i < 1000; i++) {sharedBuffer.append("A");}});// 创建第二个线程 thread2Thread thread2 = new Thread(() -> {// 在这个线程中,循环 1000 次向 sharedBuffer 中追加字符'B'for (int i = 0; i < 1000; i++) {sharedBuffer.append("B");}});// 启动第一个线程thread1.start();// 启动第二个线程thread2.start();try {// 等待第一个线程执行完毕thread1.join();// 等待第二个线程执行完毕thread2.join();} catch (InterruptedException e) {// 如果在等待过程中被中断,打印异常信息e.printStackTrace();}// 输出 sharedBuffer 的长度System.out.println(sharedBuffer.length());}
}
这段代码创建了两个线程,分别向同一个StringBuffer对象中追加不同的字符。通过使用join()方法,确保主线程等待两个子线程执行完毕后再输出StringBuffer的长度。
- 适用场景:
当需要在多线程环境下操作字符串时,StringBuffer是一个合适的选择。例如,在一个多线程的服务器应用程序中,多个线程可能需要同时构建一个响应字符串,这时使用StringBuffer可以确保数据的一致性。
二、StringBuilder
StringBuilder与StringBuffer类似,也是一个可变的字符序列,但它是非线程安全的。
-
构造方法:
StringBuilder():创建一个空的字符串生成器,初始容量为 16 个字符。StringBuilder(int capacity):创建一个空的字符串生成器,具有指定的初始容量。StringBuilder(String str):创建一个字符串生成器,并将其初始内容设置为指定的字符串。
-
常用方法:
与StringBuffer的方法基本相同,包括append()、insert()、delete()、reverse()等。例如:
StringBuilder sb = new StringBuilder("Hello");
sb.append(" World!");
System.out.println(sb); // 输出:Hello World!
- 性能优势:
由于StringBuilder不需要进行线程同步,所以在单线程环境下,它的性能通常比StringBuffer更高。例如:
// 获取当前系统时间(以毫秒为单位),用于记录开始时间
long startTime = System.currentTimeMillis();
// 创建一个 StringBuilder 对象
StringBuilder sb = new StringBuilder();
// 循环 100000 次
for (int i = 0; i < 100000; i++) {// 将循环变量 i 追加到 StringBuilder 对象 sb 中sb.append(i);
}
// 再次获取当前系统时间,计算从开始到现在经过的时间,并打印使用 StringBuilder 的操作时间
System.out.println("StringBuilder time: " + (System.currentTimeMillis() - startTime));// 再次获取当前系统时间(以毫秒为单位),用于记录新的开始时间
startTime = System.currentTimeMillis();
// 创建一个 StringBuffer 对象
StringBuffer sbf = new StringBuffer();
// 循环 100000 次
for (int i = 0; i < 100000; i++) {// 将循环变量 i 追加到 StringBuffer 对象 sbf 中sbf.append(i);
}
// 再次获取当前系统时间,计算从这个新的开始时间到现在经过的时间,并打印使用 StringBuffer 的操作时间
System.out.println("StringBuffer time: " + (System.currentTimeMillis() - startTime));
分别使用StringBuilder和StringBuffer进行大量的字符串拼接操作,可以看到StringBuilder的执行时间通常更短。
- 适用场景:
在单线程环境下,当需要高效地操作字符串时,StringBuilder是一个很好的选择。例如,在一个桌面应用程序中,只有一个主线程在操作字符串,这时使用StringBuilder可以提高性能。
三、总结
StringBuffer和StringBuilder都是 Java 中用于操作可变字符串的工具类。它们的主要区别在于线程安全性和性能。StringBuffer是线程安全的,但性能相对较低;StringBuilder是非线程安全的,但在单线程环境下性能更高。在选择使用哪个类时,需要根据具体的应用场景来决定。如果是在多线程环境下操作字符串,应该使用StringBuffer;如果是在单线程环境下,为了获得更好的性能,可以选择使用StringBuilder。
相关文章:
StringBuffer与StringBuilder 2024-8-21 22-13
目录 一、StringBuffer二、StringBuilder三、总结 一、StringBuffer StringBuffer是一个可变的字符序列,它的存在是为了解决频繁操作字符串时产生大量临时对象的问题。 构造方法: StringBuffer():创建一个空的字符串缓冲区,初始容…...
会声会影剪辑视频收费吗,会声会影最新破解版
会声会影2024:引领视频创作新时代的创新之旅** 在数字时代的浪潮中,视频创作已成为连接世界、表达创意的重要方式。随着技术的不断进步,一款名为“会声会影2024”的视频编辑软件横空出世,它不仅继承了前代产品的优秀传统…...
在Windows11强制开启copilot
在 Windows 11 上启用自带的基于 GPT-4 的 Copilot 功能。以下是具体步骤: 更新系统: 确保你的 Windows 11 系统已经更新到最新版本(23H2 或更高版本)。你可以在“设置” > “Windows 更新”中检查并安装最新更新。 更改区域和…...
基于Java的开源CMS有哪些推荐,各自特点是什么
最强大、最易用的CMS,向大家做一个简要介绍。 01 Alfresco Alfresco是一个开源的企业网站内容管理系统,它提供了文档管理、多人协作、记录管理、知识管理网页内容和图像管理等功能。它使用Spring、 Hibernate、 Lucene 和JSF等最新java技术构建了模…...
IPC进程通信以及网络通信
一、IPC 进程间通信方式 共享内存 //最高效的进程间通信方式 不需要把用户的东西再复制到内核 他们与内核进行绑定 共享内存: 1、是一块,内核预留的空间 2、最高效的通信方式 //避免了用户空间到内核空间的数据拷贝 IPC通信方式 ---操作流程类似的…...
【脏数据 bug 解决】ValueError: mean must have 1 elements if it is an iterable, got 3
问题描述: 在训练模型的过程中,出现 clip_image_processor 无法处理数据的问题,说明数据集中很可能出现了脏数据。本文使用的数据为 LAION-Aesthetics-V2-6.5plus,从 https://dagshub.com/DagsHub-Datasets/LAION-Aesthetics-V2-…...
【Vue3】集成 Ant Design Vue
【Vue3】集成 Ant Design Vue 背景简介开发环境开发步骤及源码总结 背景 随着年龄的增长,很多曾经烂熟于心的技术原理已被岁月摩擦得愈发模糊起来,技术出身的人总是很难放下一些执念,遂将这些知识整理成文,以纪念曾经努力学习奋斗…...
如何处理前端项目中的SEO优化:从SPA到SSR与SSG
如何处理前端项目中的SEO优化:从SPA到SSR与SSG 在前端开发的日常工作中,你可能经常会遇到这样的情况:辛辛苦苦写了一个功能丰富、界面炫酷的单页应用(SPA),但上线后发现搜索引擎的表现却不尽如人意。页面内…...
【UE5】Groom毛发系统的基本使用——给小白人添加头发
目录 效果 步骤 一、准备 二、使用3DsMax制作毛发 三、在UE中给小白人安装毛发 四、修改毛发材质 效果 步骤 一、准备 1. 新建一个第三人称模板工程 2. 在项目设置中,勾选“支持计算蒙皮缓存” 3. 在插件面板中,启用“Groom”和“Alembic Gro…...
DataWorks函数
文章目录 0、MaxCompute预置的函数分类1、日期函数2、数学函数3、算术运算符4、窗口函数5、聚合函数6、字符串函数7、复杂类型函数8、加密函数9、其他函数 0、MaxCompute预置的函数分类 函数类型说明日期函数支持处理DATE、DATETIME、TIMESTAMP等日期类型数据,实现…...
设计模式学习优质网站分享:refactoring.guru
地址 英文版地址:https://refactoring.guru/design-patterns 中文版地址:https://refactoringguru.cn/design-patterns 介绍 这个网站是专门学习 设计模式 和 软件重构 的网站 整体来说并不花哨,但我觉得他最大的优点就是: 概…...
JVM-Java的四种引用
引用分析 无论是通过引用计数算法判断对象的引用数量,还是通过可达性分析算法判断对象是否可达,判定对象是否可被回收都与引用有关,Java 提供了四种强度不同的引用类型 强引用: 被强引用关联的对象不会被回收,只有所…...
探索《黑神话:悟空》品质保障的背后:ISO体系认证
《黑神话:悟空》横空出世 8月20日上午10点,国产首款大型3A游戏《黑神话:悟空》正式上线。游戏一经上线便吸引了无数国内外用户的关注,不仅仅是因为其高超的游戏制作技术,极高的画面精度,精良的的视觉和战斗…...
ArcGIS Pro 实现人口分布栅格TIFF数据的网格提取与可视化
这里在分享一个人口1km精度栅格数据,LandScan是由美国能源部橡树岭国家实验室(ORNL)提供的全球人口分布数据集,具有最高分辨率的全球人口分布数据,是全球人口数据发布的社会标准,是全球最为准确、可靠&…...
select的缺点;poll ;poll的缺点;epoll
1.select的缺点: 1.select监听的文件描述符集合是一个数组,有上限(1024个) 2.select监听的文件描述符集合在应用层,内核层监听事件后需要传递给用户层带来资源开销 3.select需要用户手动查找产生事件的文件…...
keli5_报错 Cannot Load Device Description问题
1原因 之前创建的keli5的项目软件版本与当前的软件版本不同 使其算法要重新选择 2解决方法 2-1 点击图中的魔术棒 2-2 在这个界面中进入 Settings选项(ST-Link Debugger 旁边) 2-3 点击Flash Download 选项进入图中界面 在点击天加 2-4选择fla…...
算法的学习笔记—把二叉树打印成多行(牛客JZ78)
😀前言 在算法面试中,二叉树的层序遍历是一个经典的题目。而这道题的要求是进一步将二叉树的每一层结点值打印成多行,即同一层结点从左至右输出,最终结果存放到一个二维数组中返回。接下来,我们将通过代码实例详细解析…...
FreeRTOS 时间管理
延时函数介绍 函数 描述 vTaskDelay() 相对延时 xTaskDelayUntil() 绝对延时 相对延时:指每次延时都是从执行函数vTaskDelay()开始,直到延时指定的时间结束 绝对延时:指将整个任务的运行周期看成一个整体,适用于需要按…...
F. Valuable Cards D. Smithing Skill
D题 F题 F题: 因为是连续的且都要选,我们直接从左到右去取每个区间到不合法的情况即可,可以在n1的位置添加一个x来结束区间判断。因为是要乘积为x,那么我们只需要放x的因子进去,不然会超时,同时也可以用v…...
【电子通识】IPC-A-600中对验收标准的定义
在文章【电子通识】IPC-A-610标准对产品的四种验收条件都是什么意思?中我们讲到IPC-A-610标准(电子组件的可接受性)对于产品的四种验收条件。本文中我们同理讲一讲IPC-A-600中对验收标准的定义。 IPC-A-600文件中的多数示意图和照片同时表示每…...
互联网产品创新:基于Qwen3-ASR-0.6B的在线教育实时字幕解决方案
互联网产品创新:基于Qwen3-ASR-0.6B的在线教育实时字幕解决方案 1. 引言 想象一下,你正在上一节重要的在线直播课,老师讲得飞快,有些专业术语没听清,或者因为网络波动声音断断续续。又或者,你身处一个嘈杂…...
智能车小白也能懂的舵机PD控制:从电感差比和到方向控制,保姆级避坑指南
智能车方向控制入门:用PD算法驯服你的舵机 第一次看到智能车在赛道上流畅过弯时,很多人都会好奇——这辆小车是如何感知赛道边界并精准控制方向的?作为电磁组智能车的核心部件,舵机就像车辆的"方向盘",而PD控…...
OmenSuperHub:解锁惠普游戏本隐藏性能的开源控制方案
OmenSuperHub:解锁惠普游戏本隐藏性能的开源控制方案 【免费下载链接】OmenSuperHub 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否厌倦了官方Omen Gaming Hub的臃肿体验?想要一个纯净、高效的硬件控制工具来释放你的惠普游…...
保姆级教程:在Ubuntu 22.04物理机上,从开启SSH到配置IPv6防火墙的完整流程
Ubuntu 22.04物理机从SSH配置到IPv6防火墙的完整安全指南 当你拿到一台全新的Ubuntu物理机时,如何安全地配置远程访问并启用IPv6连接?本文将带你从零开始,一步步完成从系统初始化到防火墙配置的全过程。无论你是搭建家庭服务器、开发测试环境…...
Wireshark网络协议分析技术与实践指南
1. 网络协议分析技术概述1.1 Wireshark工具简介Wireshark(前称Ethereal)是目前最主流的开源网络协议分析工具,采用WinPCAP接口直接与网卡进行数据报文交换。该工具支持超过2000种网络协议的解析,能够实时捕获和分析网络数据包。1.…...
EfficientNet实战:如何在移动端部署B0-B7模型(附显存优化技巧)
EfficientNet移动端部署实战:从模型选型到显存优化全解析 在移动端和边缘计算场景中部署深度学习模型,就像给一辆跑车装上节能引擎——既要保持性能,又要极致压缩资源消耗。EfficientNet系列模型正是这种平衡艺术的代表作,但当开发…...
突破限制:跨平台VMware macOS虚拟机部署全指南——非苹果硬件的macOS体验方案
突破限制:跨平台VMware macOS虚拟机部署全指南——非苹果硬件的macOS体验方案 【免费下载链接】unlocker VMware macOS utilities 项目地址: https://gitcode.com/gh_mirrors/unl/unlocker Unlocker是一款针对VMware Workstation和Player的开源补丁工具&…...
ROS中tf2坐标系命名规范详解:为什么你的/world会报Invalid argument错误
ROS中tf2坐标系命名规范详解:为什么你的/world会报Invalid argument错误 在ROS机器人开发中,坐标系转换(tf2)系统是构建空间感知的核心基础设施。许多开发者第一次遇到Invalid argument "/world" passed to canTransfor…...
实时手机检测模型应用场景:打电话检测、安防监控实战案例
实时手机检测模型应用场景:打电话检测、安防监控实战案例 1. 模型概述与技术优势 1.1 高性能检测框架DAMOYOLO 实时手机检测-通用模型基于DAMOYOLO-S框架开发,这是一种面向工业落地的高性能目标检测解决方案。相比传统YOLO系列方法,DAMOYO…...
OpenClaw故障排查大全:GLM-4.7-Flash接口连接失败的7种解决方法
OpenClaw故障排查大全:GLM-4.7-Flash接口连接失败的7种解决方法 1. 问题背景与现象描述 上周在尝试将本地部署的GLM-4.7-Flash模型接入OpenClaw时,我遇到了令人抓狂的接口连接问题。明明模型服务已经正常启动,OpenClaw配置看起来也没问题&a…...
