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

Java开发-面试题-0001-String、StringBuilder、StringBuffer的区别

Java开发-面试题-0001-String、StringBuilder、StringBuffer的区别

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

CSDN: CodeZeng1998

其他平台:CodeZeng1998好锅

说明:Java 版本为 1.8

String、StringBuilder、StringBuffer的区别

  • 可变性

    • String:不可改变,一旦创建就无法修改。(扩展:字符串常量池~)

    • StringBuilder:可变的,内容可修改。

    • StringBuffer:可变的,内容可修改。

  • 线程安全性

    • String:不可变的,天生线程安全。

      // 底层是字符数组
      private final char value[];
      
    • StringBuilder:非线程安全。

    • StringBuffer:线程安全。(synchronized修饰)

          @Overridepublic synchronized StringBuffer append(Object obj) {toStringCache = null;super.append(String.valueOf(obj));return this;}
      
  • 性能

    • String:由于不可变性,对于频繁修改来说效率较低。
    • StringBuilder:由于可变性,对于频繁修改来说效率较高。
    • StringBuffer:由于线程安全的开销,略低于StringBuilder。
  • 内存使用

    • String:可能导致内存浪费,因为修改会创建新对象。(每当执行任何看似修改字符串的操作,如连接(+ 操作符)、创建子字符串或替换时,都会在内存中创建一个新的字符串对象,其内容被修改。)

    • StringBuilder:内存使用更高效,因为可以直接修改内容而不创建新对象。

      // StringBuilder 可以在不创建新的 String 对象的情况下,直接修改其内部的字符数组,并实时更新内容。这种直接的字符数组操作使得在进行字符串追加时能够避免额外的内存分配和对象创建,从而提高了性能和内存使用效率。public AbstractStringBuilder append(String str) {if (str == null)return appendNull();int len = str.length();// 数组扩容ensureCapacityInternal(count + len);// 追加字符串,底层是 native 修饰的System.arraycopy(...)方法实现数组拷贝str.getChars(0, len, value, count);count += len;return this;}
      
    • StringBuffer:与StringBuilder类似,但由于线程安全的原因略有开销。

  • 使用场景

    • String:适用于需要不可变性和线程安全性,并且修改较少的场景。
    • StringBuilder:适用于需要频繁修改而不需要线程安全的场景。
    • StringBuffer:适用于需要线程安全性的场景,即需要牺牲一些性能。

在这里插入图片描述

上图由 Pic 生成

更多内容欢迎关注我(持续更新中,欢迎Star✨)

Github:CodeZeng1998/Java-Developer-Work-Note

技术公众号:CodeZeng1998(纯纯技术文)

生活公众号:好锅(Life is more than code)

CSDN: CodeZeng1998

其他平台:CodeZeng1998好锅

相关文章:

  • Gir clone 设置代理与错误
  • [每日一练]查询从不订购的客户(标量子查询)
  • 数据结构——二叉树的实现
  • opencv进阶 ——(七)图像处理之寸照换背景
  • 基于python flask的旅游数据大屏实现,有爬虫有数据库
  • 算法的时间与空间复杂度
  • 【C++面试100问】第八十五问:有了const,C++11为什么还要引入constexpr
  • 【busybox记录】【shell指令】readlink
  • Google发布的CAT3D,在1分钟内,能够从任意数量的真实或生成的图像创建3D场景。
  • 基于STM32+NBIOT(BC26)设计的物联网观赏鱼缸
  • 【前端每日基础】day27——小程序开发
  • 居间人从事光伏行业需要了解的关键因素
  • STM32实验之USART串口发送+接受数据(二进制/HEX/文本)
  • Putty: 随心御剑——远程启动服务工具plink
  • 【XR806开发板试用】基础篇,从零开始搭建一个LCD彩屏时钟(ST7735S驱动)
  • 【mysql】环境安装、服务启动、密码设置
  • JavaScript DOM 10 - 滚动
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • jQuery(一)
  • node 版本过低
  • Python_网络编程
  • React中的“虫洞”——Context
  • Spark RDD学习: aggregate函数
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • Theano - 导数
  • Zsh 开发指南(第十四篇 文件读写)
  • 从零开始的无人驾驶 1
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 机器学习学习笔记一
  • 人脸识别最新开发经验demo
  • 如何选择开源的机器学习框架?
  • 收藏好这篇,别再只说“数据劫持”了
  • 学习使用ExpressJS 4.0中的新Router
  • 一个JAVA程序员成长之路分享
  • 在GitHub多个账号上使用不同的SSH的配置方法
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • "无招胜有招"nbsp;史上最全的互…
  • ### RabbitMQ五种工作模式:
  • #在线报价接单​再坚持一下 明天是真的周六.出现货 实单来谈
  • $nextTick的使用场景介绍
  • (C语言)fread与fwrite详解
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (深入.Net平台的软件系统分层开发).第一章.上机练习.20170424
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (译) 函数式 JS #1:简介
  • (译) 理解 Elixir 中的宏 Macro, 第四部分:深入化
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • (转载)Linux网络编程入门
  • ****Linux下Mysql的安装和配置
  • .gitignore文件---让git自动忽略指定文件
  • .Net Core webapi RestFul 统一接口数据返回格式