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

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.lryc.cn/news/304218.html

相关文章:

  • 【软件架构】02-复杂度来源
  • 怎样让MCU/SFU视频会议ovmedia 接入GB28281监控视频参会互动
  • Spring Boot打war包部署到Tomcat,访问页面404 !!!
  • Docker Desktop 4.27.1 Windows 10 安装 教程
  • 【ARMv8M Cortex-M33 系列 8 -- RT-Thread 移植 posix pthread】
  • fastApi笔记08-Cookie和Header
  • 解决pycharm中PIL安装失败
  • 数据结构哈希表
  • [C#]winform使用引导APSF和梯度自适应卷积增强夜间雾图像的可见性算法实现夜间雾霾图像的可见度增强
  • 【Django】Django自定义后台表单——对一个关联外键对象同时添加多个内容
  • 迷茫?没有努力的方向?没有耐心去坚持?精选书籍推荐2
  • MySQL报错:sql_mode=only_full_group_by解决方法
  • SQL表连接方式
  • 5 原型模式 Prototype
  • springboot java 项目连接es
  • MySQL学习笔记3: MySQL数据库基础
  • GB/T 17640-2023 长丝机织土工布检测
  • MedicalGPT 训练医疗大模型,实现了包括增量预训练、有监督微调、RLHF(奖励建模、强化学习训练)和DPO(直接偏好优化)
  • UE4 C++联网RPC教程笔记(一)(第1~4集)
  • 备战蓝桥杯 Day11(滚动数组优化+完全背包)
  • Java SE 入门到精通—4.抽象类与接口【Java】
  • Python 开发转 Java 简易路线 - 更新中
  • Python编程语言学习
  • Cartographer框架简述
  • 适用于 Linux、Windows 和 macOS 的免费 ONLYOFFICE 桌面应用程序
  • C++面向对象程序设计-北京大学-郭炜【课程笔记(四)】
  • 前端构建效率优化之路
  • react实现拖拽的插件
  • 解决Uncaught SyntaxError: Cannot use import statement outside a module(at XXX)报错
  • PHP如何利用post与get方式传值接收数据