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

【Java基础面试题026】Java中的String、StringBuffer和StringBuilder的区别是什么?

回答重点

他们都是Java中处理字符串的类,区别主要体现在可变性线程安全性能上

1)String

  • 不可变:String是不可变类,字符串对象创建,存储在堆中,字符串内容存储在字符串常量池中,一旦创建内容无法更改。每次对String进行修改操作(如拼接、截取等),都会创建新的字符串常量池对象
  • 适合场景:String适合于字符串内容不会频繁变化的场景

2)StringBuffer

  • 可变:StringBuffer是可变的,因为底层是字符数组,(字符是局部变量存栈上,跟着方法一起的生命周期,如果是成员变量存在堆中,跟着对象)任何操作都是对数组操作,而不是创建新的对象,可以进行字符串的追加、删除、插入等操作
  • 线程安全:StringBuffer是线程安全的,内部使用了synchronized关键字保证多线程环境下的安全性
  • 适合场景:适用于多线程环境中需要频繁修改字符串的场景

3)StringBuilder

  • 可变:也是可变的,提供了与StringBuffer类似的操作方法
  • 非线程安全:线程不安全
  • 性能:由于少了同步的操作,性能开销比StringBuffer小
  • 适合场景:适用于单线程环境中需要大量修改字符串的场景

可以看我的另一篇博客:【Java】StringBuilder类和StringBuffer类的简单教程-CSDN博客

扩展知识

Java8中的优化

在Java8以后,编辑器会对字符串的常量拼接做优化,将字符串拼接转换为StringBuilder操作。种优化提高了代码性能,但是在动态拼接或多线程场景下,手动使用StringBuilder 和 StringBuffer 仍然更合适。

从演进角度看待三者

String 是Java 中基础且重要的类,并且String 也是Immutable 类的典型实现,被声明为finalclass,除了hash


这个属性其它属性都声明为final。


因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所景响。


StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类,提供append和insert方法,可以将字符串添加到已有序列的末尾或指定位置。


它的本质是一个线程安全的可修改的字符序列,把所有修改数据的方法都加上了synchronized。但是保证了线程安全是需要性能的代价的。


在很多情况下我们的字符串拼接操作不需要线程安全,这时候StringBuilder 登场了,StringBuilder 是JDK1.5 发布的,它和StringBuffer本质上没什么区别,就是去掉了保证线程安全的那部分,减少了开销。


StringBuffer 和 StringBuilder 二者都继承了 Abst ractStringBuilder,底层都是利用可修改的 char 数组(JDK 9以后是byte 数组)。


所以如果我们有大量的字符串拼接,如果能预知大小的话最好在new StringBuffer 或者StringBuilder 的时候设置好capacity,避免多次扩容的开销(扩容要抛弃原有数组,还要进行数组拷贝创建新的数组)。

相关文章:

【Java基础面试题026】Java中的String、StringBuffer和StringBuilder的区别是什么?

回答重点 他们都是Java中处理字符串的类,区别主要体现在可变性、线程安全和性能上 1)String 不可变:String是不可变类,字符串对象创建,存储在堆中,字符串内容存储在字符串常量池中,一旦创建内…...

解析在OceanBase创建分区的常见问题|OceanBase 用户问题精粹

在《分区策略和管理分区计划的实践方案》这篇文章中,我们介绍了在ODC中制定分区策略及有效管理分区计划的经验。有不少用户在该帖下提出了使用中的问题,其中一个关于创建分区的限制条件的问题,也是很多用户遭遇的老问题。因此本文以其为切入&…...

Flutter组件————Container

Container Container 是 Flutter 中最常用的布局组件之一 参数 参数名称类型描述alignmentAlignmentGeometry定义子组件在其内部的对齐方式,默认为 null,即不改变子组件的位置。paddingEdgeInsetsGeometry内边距,用于在子组件周围添加空间…...

Java重要面试名词整理(二):SpringMyBatis

文章目录 Spring篇Spring核心推断构造方法AOP动态代理Advice的分类Advisor的理解AOP相关的概念 定义BeanASM技术JFR依赖注入循环依赖LifecycleSpring AOT Spring事务Spring事务传播机制Spring事务传播机制是如何实现的呢?Spring事务传播机制分类 SpringMVCHandlerHandlerMappi…...

Excel生成DBC脚本源文件

Excel制作 新建一个Excel,后缀为“.xls” 工作本名称改为“CAN_Matrix” 在首行按照列来起名字,在里面只需要填写必须的内容即可。 列数名称第0列Message Name第1列Message Format第2列Message ID第3列Message Length (byte)第4列Message Transmitte…...

Git进阶:本地或远程仓库如何回滚到之前的某个commit

在Git的使用过程中,我们经常会遇到需要回滚到之前某个commit的情况。无论是为了修复错误、撤销更改,还是为了重新组织代码,回滚到特定commit都是一个非常有用的技能。本文将介绍几种常用的回滚方法,帮助读者更好地掌握Git版本控制…...

linux 中文输入法设置的宏观思路 (****)

乱是永远的不乱,变是永远的不变。 $ ibus help # 注意:help 前没有杠符号 $ setxkbmap -help # 注意:help 前只有一个杠符号 $ localectl --help # 注意:help 前有 2 个杠符号 $ man im-config # 注意:-h, --help 只出来提示信息:请参考。。。。。。。 $ man abc…...

271-基于XC7V690T的12路光纤PCIe接口卡

一、板卡概述 基于XC7V690T的12路光纤PCI-E接口卡,用于实现多通道高速光纤数据接收和发送,板卡兼容PCIe 2.0和PCIe 3.0规范,利用PCI-E Switch PEX 8748实现FPGA芯片与计算机的通信,计算机与板卡接口处提供PCI-e 16速接口&#xff…...

Semaphore UI安装和实践

本次实验环境采用centos7.9操作系统,使用rpm包安装方式。 1.配置yum源 --下载centos华为云镜像仓库 wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.huaweicloud.com/repository/conf/CentOS-7-anon.repo[rootlocalhost ~]# wget -O /etc/yum.repos.…...

Redis篇--常见问题篇7--缓存一致性2(分布式事务框架Seata)

1、概述 在传统的单体应用中,事务管理相对简单,通常使用数据库的本地事务(如MySQL的BEGIN和COMMIT)来保证数据的一致性。然而,在微服务架构中,由于每个服务都有自己的数据库,跨服务的事务管理变…...

Docker Compose 安装 Harbor

我使用的系统是rocky Linux 9 1. 准备环境 确保你的系统已经安装了以下工具: DockerDocker ComposeOpenSSL(用于生成证书)#如果不需要通过https连接的可以不设置 1.1 安装 Docker 如果尚未安装 Docker,可以参考以下命令安装&…...

使用docker compose安装gitlab

使用docker compose安装gitlab GitLab简介设置GITLAB_HOME路径创建docker挂载目录获取可用的GitLab版本编写docker-compose.yml文件启动docker基础配置GITLAB_OMNIBUS_CONFIG修改配置 中文设置数据库配置系统邮箱配置 GitLab简介 ‌GitLab是一个基于Git的开源项目,…...

大模型日报 2024-12-18

大模型日报 2024-12-18 大模型资讯 标题: 3B模型长思考后击败70B!HuggingFace逆向出o1背后技术细节并开源 摘要:这篇文章探讨了小模型在经过长时间思考后,如何在性能上超越更大规模模型的现象。HuggingFace通过逆向工程和开源技术…...

Linux安装mysql5.7

一、下载mysql5.7 ​ 首先我们需要去下载linux版本的mysql-5.7.24的安装包。 1.可以去官方网站链接: https://downloads.mysql.com/archives/community/ ,下载mysql-5.7.24-linux-glibc2.12-x86_64.tar压缩包。 2.在线下载,使用wget命令,直接从官网下载…...

【容器】k8s学习笔记原理详解(十万字超详细)

Pod详解 Pod介绍 Pod结构 每个Pod中都可以包含一个或者多个容器,这些容器可以分为两类: 用户程序所在的容器,数量可多可少Pause容器,这是每个Pod都会有的一个根容器,它的作用有两个: 可以以它为依据&am…...

.NET重点

B/S C/S B/S: 浏览器端:JavaScript,HTML,CSS 服务器端:ASP(.NET)PHP/JSP 优势:维护方便,易于升级和扩展 劣势:服务器负担沉重 C/S java/.NET/VC系列 …...

SMMU软件指南SMMU编程之虚拟机结构和缓存

安全之安全(security)博客目录导读 目录 一、虚拟机结构(VMS) 二、缓存 一、虚拟机结构(VMS) 虚拟机结构(VMS)是SMMU中的概念,是一个由STE.VMSPtr字段指向的结构,包含每个虚拟机的配置设置。在相同安全状态下具有相同虚拟机ID(VMID)的多个STE必须指向相同的VMS。…...

Go 语言并发实战:利用协程处理多个接口进行数据融合

高效地处理多个数据源并将其整合为有意义的结果是开发中一项重要的任务。Go 语言,以其强大的并发特性,为我们提供了优雅而高效的解决方案。那么我们探讨一下如何利用 Go 语言的协程,同时调用多个接口获取数据,并将这些数据无缝地合…...

Redis Hash Tag 知识详解

一、Redis Hash Tag概述 Redis Hash Tag是Redis集群环境里用于控制数据分片的关键机制。在Redis集群中,数据依据键的哈希值来确定分片存储位置。Hash Tag能让用户指定键的特定部分作为哈希计算核心部分,进而使相关键存储于同一节点,这对处理…...

在 Ubuntu 上安装 Muduo 网络库的详细指南

在 Ubuntu 上安装 Muduo 网络库的详细指南 首先一份好的安装教程是非常重要的 C muduo网络库知识分享01 - Linux平台下muduo网络库源码编译安装-CSDN博客 像这篇文章就和shit一样,安装到2%一定会卡住,如果你不幸用了这个那真是遭老罪了 环境&#xf…...

解锁Navicat密码:突破加密限制的开源解密工具

解锁Navicat密码:突破加密限制的开源解密工具 【免费下载链接】navicat_password_decrypt 忘记navicat密码时,此工具可以帮您查看密码 项目地址: https://gitcode.com/gh_mirrors/na/navicat_password_decrypt 当数据库连接密码被Navicat加密保存却无法记起&…...

中国空间智能,梦想照进现实

2026年初,AI教母李飞飞的AI公司World Labs再次获得一笔10亿美元的投资,投资名单除了传统投资机构外,还不乏英伟达、Autodesk等行业巨头,这清晰地传递出市场信号:继AI大语言模型之后,空间智能已成为AI的下一…...

Llama-3.2V-11B-cot部署详解:自动修复视觉权重加载致命Bug全过程

Llama-3.2V-11B-cot部署详解:自动修复视觉权重加载致命Bug全过程 1. 项目概述 Llama-3.2V-11B-cot是基于Meta Llama-3.2V-11B-cot多模态大模型开发的高性能视觉推理工具,专为双卡RTX 4090环境深度优化。本工具通过自动修复视觉权重加载等核心Bug&#…...

别再只用交叉熵了!医疗AI中疾病分级任务,试试PyTorch实现这个序数回归损失函数

医疗AI中的序数回归:超越交叉熵的疾病分级新范式 在医疗人工智能领域,我们经常遇到需要预测疾病严重程度分级的任务——从轻度到中度再到重度,这些类别之间存在明确的递进关系。传统做法是直接套用交叉熵损失函数,但这就像用尺子测…...

1771-OZL处理器模块

1771-OZL 处理器模块 — 产品特点1771-OZL 是1771系列的PLC处理器模块,用于工业自动化系统的逻辑运算与过程控制。适用于PLC-5标准机架控制系统支持数字量输入/输出及模拟量接口内置高速逻辑运算功能可执行顺序控制和定时/计数功能支持程序存储与在线修改高可靠性设…...

Qt安卓开发实战:从红米K60调试到多机型适配指南

1. Qt安卓开发环境准备 搞Qt安卓开发,首先得把环境搭好。这里假设你已经按照官方文档或者教程配置好了Qt Creator和Android SDK/NDK。如果还没搞定,建议先去Qt官网把Android开发套件下载齐全,包括: Qt for Android(建议…...

Unsloth让AI触手可及:免费GPU+开源框架,训练自己的模型

Unsloth让AI触手可及:免费GPU开源框架,训练自己的模型 1. Unsloth简介:高效微调的开源利器 Unsloth是一个专为大型语言模型(LLM)优化的开源微调框架,它的核心使命是让AI训练变得高效且易于获取。通过创新的技术手段,…...

告别Python版本混乱!Windows下用pyenv-win + virtualenvwrapper打造多项目开发环境(保姆级避坑指南)

告别Python版本混乱!Windows下用pyenv-win virtualenvwrapper打造多项目开发环境(保姆级避坑指南) 你是否经历过这样的场景:手头同时维护着三个Python项目——一个基于Django 2.2的老系统要求Python 3.6,新开发的Fast…...

SDMatte API接口开发教程:基于Python Flask构建标准化服务

SDMatte API接口开发教程:基于Python Flask构建标准化服务 1. 开篇:为什么需要API接口 如果你用过SDMatte这个强大的图像抠图工具,可能会遇到这样的场景:想把抠图功能集成到自己的应用里,或者需要批量处理大量图片。…...

APKMirror:安卓应用安全管理的终极解决方案

APKMirror:安卓应用安全管理的终极解决方案 【免费下载链接】APKMirror 项目地址: https://gitcode.com/gh_mirrors/ap/APKMirror 您是否曾在寻找安卓应用的特定版本时感到无从下手?是否担忧从第三方渠道下载的APK文件可能存在安全隐患&#xff…...