Java程序中为什么要使用StringBuilder

遇到这个问题是来源于leetcode的一道题:字符串解码。其中的题解涉及字符串的操作使用的是StringBuilder,不是String。

class Solution {public String decodeString(String s) {StringBuilder res = new StringBuilder();int multi = 0;LinkedList<Integer> stack_multi = new LinkedList<>();LinkedList<String> stack_res = new LinkedList<>();for(Character c : s.toCharArray()) {if(c == '[') {stack_multi.addLast(multi);stack_res.addLast(res.toString());multi = 0;res = new StringBuilder();}else if(c == ']') {StringBuilder tmp = new StringBuilder();int cur_multi = stack_multi.removeLast();for(int i = 0; i < cur_multi; i++) tmp.append(res);res = new StringBuilder(stack_res.removeLast() + tmp);}else if(c >= '0' && c <= '9') multi = multi * 10 + Integer.parseInt(c + "");else res.append(c);}return res.toString();}
}作者:Krahets
链接:https://leetcode.cn/problems/decode-string/solutions/19447/decode-string-fu-zhu-zhan-fa-di-gui-fa-by-jyd/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

现在知道了问题的主要原因是StringBuilder可以对字符串内容操作,且效率高。

StringStringBufferStringBuilder
Stirng的值是不可变的,每次对String操作都会产生新对象。效率低下而且还浪费空间StringBuffer是可变类,是线程安全的,可以对字符串操作,不会产生新对象。而且StringBuffer对象有缓冲区容量,字符串大小没有超过不会扩容,超过空间会自动扩容也是可变类,速度更快,但线程不安全
不可变可变可变
线程安全线程不安全
可多线程操作单线程操作

一、Java String类(String字符串常量)

String和StringBuffer的性能差别在于String是不可变对象,每次对String对象改变时,都会新创建一个对象,然后重新指向,指向堆内存中新的对象,这种方式的特点是时间效率低下,而且浪费内存空间,所以,经常改变字符串内容最好不要使用String。每次生成对象都对性能有所影响。

二、Java StringBuffer StringBuilder 类——StringBuffer StringBuilder字符串变量

StringBuffer字符串变量——线程安全
StringBuilder字符串变量——线程不安全
当需要频繁更改字符串时,最好使用StringBuffer和StringBuilder,可以多次修改,且当修改字符串是,不会产生新的对象。

StringBuffer和StringBuilder的区别在于效率和线程安全。
字符串频繁修改的话,一般使用StringBuilder,因为其效率比StringBuffer快。如果要求线程安全的话,就使用StringBuffer,因为StringBuilder不支持线程安全。

参考:String、StringBuffer与StringBuilder之间区别

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/693518.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MR专题:体验Apple Vision Pro多元生态内容,拥抱MR供应链机遇

今天分享的是MR系列深度研究报告&#xff1a;《MR专题&#xff1a;体验Apple Vision Pro多元生态内容&#xff0c;拥抱MR供应链机遇》。 &#xff08;报告出品方&#xff1a;方正证券&#xff09; 报告共计&#xff1a;15页 来源&#xff1a;人工智能学派 Apple Vision Pro…

基因富集分析——GO/DO

DO&#xff08;Disease Ontology&#xff09;分析涉及多种具体的步骤和方法&#xff0c;下面是一些常见的DO分析步骤或方法&#xff1a; 1. 疾病分类和定义&#xff1a;分析DO中的疾病分类体系&#xff0c;理解不同疾病之间的关系和归类。这包括查看DO本体中的层次结构、疾病之…

本地TCP通讯(C++)

概要 利用TCP技术&#xff0c;实现本地ROS1和ROS2的通讯。 服务端代码 头文件 #include <ros/ros.h> #include "std_msgs/String.h" #include "std_msgs/Bool.h" #include <iostream> #include <cstring> #include <unistd.h>…

消息队列-RabbitMQ:workQueues—工作队列、消息应答机制、RabbitMQ 持久化、不公平分发(能者多劳)

4、Work Queues Work Queues— 工作队列 (又称任务队列) 的主要思想是避免立即执行资源密集型任务&#xff0c;而不得不等待它完成。我们把任务封装为消息并将其发送到队列&#xff0c;在后台运行的工作进程将弹出任务并最终执行作业。当有多个工作线程时&#xff0c;这些工作…

AVEC-为编译后的可执行程序添加资源

AVEvasionCraftOnline 一个在线免杀的web端程序&#xff0c;可以绕过常见杀软 项目地址&#xff1a;https://github.com/yutianqaq/AVEvasionCraftOnline AVEvasionCraftOnline - 小更新 sha256sum AVEvasionCraftOnline.jar AVEvasionCraftOnline-v1.1.zip 896387a21946b1…

vulnhub练习 DC-1复现及分析

一、搭建环境 1.工具 靶机&#xff1a;DC-1 192.168.200.17 攻击机&#xff1a;kali 192.168.200.13 2.注意 攻击机和靶机的网络连接方式要相同&#xff0c;另外DC-1的网络连接方式我这里采用NAT模式&#xff0c;是与kali的网络连接模式相同的&#xff08;当然亦可以选用桥…

前端使用QGIS工具生成地图

1 找到所需要地图的 json 数据 1.1 查找 json 数据的两个网址&#xff08;个人常用&#xff09; 1.1.1 DataV.GeoAtlas 网站 DataV.GeoAtlas 这个网站不能具体到县内包含的城镇分化&#xff0c;但是对于县级以上的地图数据&#xff0c;使用起来很方便。 1.1.2 POI数据 网站 …

创作无版权素材:解放创意的利器

title: 创作无版权素材&#xff1a;解放创意的利器 date: 2024/2/21 13:52:09 updated: 2024/2/21 13:52:09 tags: 无版权创作自由法律合规节省成本提升质量多样素材创意工具 在当今数字化时代&#xff0c;内容创作成为了一种非常重要的方式来传达信息和表达创意。 然而&#…

【在 Windows 系统上开发 Flutter 项目并将其发布到 Ubuntu 服务器】

在 Windows 系统上开发 Flutter 项目并将其发布到 Ubuntu 服务器上&#xff0c;按照以下步骤进行操作&#xff1a; 构建 Flutter Web 应用&#xff1a; 在 Windows 系统上&#xff0c;进入Flutter 项目目录&#xff0c;然后运行 flutter build web 命令来构建你的 Flutter Web …

常见锁策略以及CAS

目录 1.1乐观锁&悲观锁 1.2轻量级锁&重量级锁 1.3自旋锁&挂起等待锁 1.4互斥锁&读写锁 1.5可重入锁&不可重入锁 1.6公平锁&非公平锁 1.7synchronized的特点 2.CAS(Compare and swap) 2.1.是什么 2.2.基于CAS方式实现的线程安全优缺点 2.3.使用场景…

设计模式----工厂模式

工厂模式 工厂模式即建立创建对象的工厂&#xff0c;实现创建者和调用者分离。 简单工厂模式&#xff1a;该模式对对象创建管理方式最为简单&#xff0c;因为他简单的对不同类对象的创建进行了一层薄薄的封装。该模式通过向工厂传递类型来指定要创建的对象。 工厂方法模式&am…

JVM对象的创建流程与内存分配

对象的创建流程与内存分配 创建流程对象内存分配方式内存分配安全问题对象内存分配流程【重要】:对象怎样才会进入老年代?重点 案例演示:对象分配过程大对象直接进入老年代02-对象内存分配的过程: 创建流程 加载 验证 解析 准备 初始化 使用 写在 对象内存分配方式 内存分配…

过滤器:Gateway GlobalFilter在分布式系统中的应用

在Spring Cloud Gateway中&#xff0c;GlobalFilter接口允许你创建全局过滤器&#xff0c;这意味着该过滤器会应用到所有的路由上&#xff0c;无论它们是否匹配特定的路由规则。Ordered接口用于定义过滤器的执行顺序。 以下是一个AuthFilter类的示例&#xff0c;该类实现了Glo…

GPT-SoVITS-WebUI 克隆声音 macos搭建

强大的少样本语音转换与语音合成Web用户界面 macos运行参考 macos conda create -n GPTSoVits python3.9 conda activate GPTSoVits激活环境 conda activate GPTSoVits停用 conda deactivate mkdir GPTSoVits cd GPTSoVits git clone https://github.com/RVC-Boss/GPT-SoVITS…

算法项目(1)—— LSTM+CNN+四种注意力对比的股票预测

本文包含什么? 项目运行的方式(包教会)项目代码(在线运行免环境配置)不通注意力的模型指标对比一些效果图运行有问题? csdn上后台随时售后.项目说明 本项目实现了基于CNN+LSTM构建模型,然后对比不同的注意力机制预测股票走势的效果。首先看一下模型结果的对比: 模型MS…

深度学习基础之《TensorFlow框架(6)—张量》

一、张量 1、什么是张量 张量Tensor和ndarray是有联系的&#xff0c;当我们print()打印值的时候&#xff0c;它返回的就是ndarray对象 TensorFlow的张量就是一个n维数组&#xff0c;类型为tf.Tensor。Tensor具有以下两个重要的属性&#xff1a; &#xff08;1&#xff09;typ…

2024年2月的TIOBE指数,go语言排名第8,JAVA趋势下降

二月头条&#xff1a;go语言进入前十 本月&#xff0c;go在TIOBE指数前10名中排名第8。这是go有史以来的最高位置。当谷歌于2009年11月推出Go时&#xff0c;它一炮而红。在那些日子里&#xff0c;谷歌所做的一切都是神奇的。在Go出现的几年前&#xff0c;谷歌发布了GMail、谷歌…

枚举类(enum)

优质博文&#xff1a;IT-BLOG-CN ​ 枚举类&#xff1a; 就是对象的实例个数是确定的&#xff08;例如&#xff1a;单例模式&#xff09;&#xff0c;也就说我们在创建枚举类的时候&#xff0c;会对构造器进行设置 一、自定义创建枚举类 为什么需要枚举类&#xff1f; 【1】…

我国无水氢氟酸产量逐渐增长 东岳集团市场占比较大

我国无水氢氟酸产量逐渐增长 东岳集团市场占比较大 无水氢氟酸是一种十分重要的化工产品&#xff0c;在常温常压下多表现为一种无色发烟液体。无水氢氟酸具有吸水性强、化学活性高、介电常数高、阻燃性能好等优点。经过多年发展&#xff0c;无水氢氟酸制备方法已经成熟&#xf…

Spring Cloud Alibaba-04-Sentinel服务容错

Lison <dreamlison163.com>, v1.0.0, 2023.09.10 Spring Cloud Alibaba-04-Sentinel服务容错 文章目录 Spring Cloud Alibaba-04-Sentinel服务容错高并发带来的问题服务雪崩效应常见容错方案Sentinel入门什么是Sentinel微服务集成Sentinel安装Sentinel控制台 实现一个接…