Java基础(3)String、StringBuffer、StringBuilder

在Java中,字符串处理是日常开发的重要组成部分。主要有三种类型的类用于创建和操作字符串:StringStringBufferStringBuilder。虽然这三个类都能够处理字符串,但它们在功能和性能方面存在显著差异。

String

String是不可变的(immutable)。每当对字符串进行修改时,实际上是创建了一个新的String对象。因此,频繁修改字符串会导致大量内存占用和最终的垃圾回收,这可能会影响性能。

String str = "Hello";
str = str + " World"; // 创建了一个新的String对象
源码解析(简化)

String类的内部,内容存储在一个final字符数组中,这就是为什么字符串是不可变的原因。

public final class String implements java.io.Serializable, Comparable<String>, CharSequence {private final char value[];// 其他方法和构造器...
}

StringBuffer

StringBuffer是可变的,并且是线程安全的,所有的公共方法都是同步的。这意味着在多线程环境下,StringBuffer的操作会比StringBuilder慢,因为它确保了线程安全。

StringBuffer buffer = new StringBuffer("Hello");
buffer.append(" World"); // 可以在不创建新对象的情况下修改字符串
源码解析(简化)

StringBuffer内部使用字符数组存储字符串内容,但没有使用final修饰符,所以内容是可变的。它通过synchronized关键字加锁以保证线程安全。

public final class StringBuffer extends AbstractStringBuilder implements java.io.Serializable, CharSequence {// AbstractStringBuilder内部实现char[] value;@Overridepublic synchronized StringBuffer append(String str) {super.append(str);return this;}// 其他方法...
}

StringBuilder

StringBuilderStringBuffer十分相似,都是可变的,并且内部实现也类似。不同之处在于StringBuilder的方法没有同步,这使得它在单线程环境下比StringBuffer更快,因为它避免了线程安全带来的性能开销。

StringBuilder builder = new StringBuilder("Hello");
builder.append(" World"); // 可以在不创建新对象的情况下修改字符串
源码解析(简化)

StringBuilder的内部也是使用字符数组来存储数据,但是它没有StringBuffer中的synchronized关键字,这意味着它不是线程安全的。

public final class StringBuilder extends AbstractStringBuilder implements java.io.Serializable, CharSequence {// AbstractStringBuilder内部实现char[] value;@Overridepublic StringBuilder append(String str) {super.append(str);return this;}// 其他方法...
}

代码演示

为了更直观地展示这三种类的使用,以下是一个简单的代码示例:

// String
String s = "Java";
s = s.concat(" Guide"); // 新建String对象// StringBuffer
StringBuffer sb = new StringBuffer("Java");
sb.append(" Guide"); // 在原有对象基础上修改// StringBuilder
StringBuilder sd = new StringBuilder("Java");
sd.append(" Guide"); // 在原有对象基础上修改

总结

  • String:不可变,适用于字符串少量操作的场景。
  • StringBuffer:可变,线程安全,适用于多线程环境下需要大量修改字符串内容的场景。
  • StringBuilder:可变,非线程安全,适用于单线程环境下需要大量修改字符串内容的场景,性能优于StringBuffer

选择哪一种取决于你的具体需求,尤其是线程安全和性能之间的权衡。

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

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

相关文章

VUE3与Uniapp 五 (v-if、v-show和template的使用)

<template><!-- v-if如果是false&#xff0c;则不会出现在DOM中&#xff0c;不会被渲染&#xff1b;v-show如果为false&#xff0c;则会出现在DOM中&#xff0c;并加载资源&#xff08;如图片&#xff09;&#xff0c;只是CSS隐藏了。 --><view v-if"day1&…

秋招后端开发面试题 - Java多线程(上)

目录 Java多线程前言面试题线程和进程&#xff1f;说说线程有几种创建方式&#xff1f;为什么调用 start() 方法时会执行 run() 方法&#xff0c;那怎么不直接调用 run() 方法&#xff1f;线程有哪些常用的调度方法&#xff1f;线程有几种状态&#xff1f;守护线程了解吗&#…

深入理解汇编中的ZF、OF、SF标志位和条件跳转

本节课在线学习视频&#xff1a;https://pan.quark.cn/s/bbc4781e5336 汇编语言中的程序控制流常依赖于处理器的状态标志来进行决策。在x86架构中&#xff0c;ZF&#xff08;Zero Flag&#xff09;、OF&#xff08;Overflow Flag&#xff09;和SF&#xff08;Sign Flag&#x…

Linux(Centos 7)环境下安装wget,并且更换阿里云镜像

Linux(Centos 7) Minimal 安装后&#xff0c;由于没有预装wget&#xff0c;在使用wget命令去下载安装相关应用时&#xff0c;提示&#xff1a;“wget: command not found” 先在Linux服务器窗口中&#xff0c;输入如下命令&#xff0c;检查Linux服务器有没有安装过wget。 rpm -…

Django信号(Signals)使用案例:自动化工作流程

Django信号&#xff08;Signals&#xff09;是一种可以让应用程序组件之间进行解耦的机制。它允许在特定事件发生时发送信号&#xff0c;其他组件可以监听这些信号并做出相应的处理。 在自动化工作流程中&#xff0c;Django信号可以用来触发自动化任务或流程。以下是一个使用D…

deepflow grafana plugin 编译问题解决

修改tsconfig.js 增加"noImplicitAny": false&#xff0c;解决代码类型没有指定&#xff0c;显示Any 错误 To solve the error, explicitly set the parameters type to any, use a more specific type or set noImplicitAny to false in tsconfig.json. https://b…

【大学生电子竞赛题目分析】——2023年H题《信号分离装置》

今年的大赛已临近落幕&#xff0c;笔者打算陆续对几个熟悉领域的题目作一番分析与讨论&#xff0c;今天首先分析H题。 网上有一些关于H题的分析&#xff0c;许多都是针对盲信号分析的。然而本题具有明确的信号频率范围&#xff0c;明确的信号可能频率&#xff0c;明确的信号波…

Jmeter Beanshell 设置全局变量

//获取token import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONArray; import java.util.*; import org.apache.jmeter.util.JMeterUtils; //获取可上机机器 String response prev.getResponseDataAsString(); JSONObject responseObect JSONObjec…

什么是跨域? 出现原因及解决方法

什么是跨域? 出现原因及解决方法 什么是跨域 跨域&#xff1a;浏览器对于javascript的同源策略的限制 。 同源政策的目的&#xff0c;是为了保证用户信息的安全&#xff0c;防止恶意的网站窃取数据。 设想这样一种情况&#xff1a;A 网站是一家银行&#xff0c;用户登录以后…

K8S哲学 - statefulSet 灰度发布

kubectl get - 获取资源及配置文件 kubectl get resource 【resourceName -oyaml】 kubectl create - 指定镜像创建或者 指定文件创建 kubectl create resource 【resourceName】 --imagemyImage 【-f my.yaml】 kubectl delete kubectl describe resource resourc…

OceanBase 分布式数据库【信创/国产化】- 登录 OceanBase 租户

本心、输入输出、结果 文章目录 OceanBase 分布式数据库【信创/国产化】- 登录 OceanBase 租户前言OceanBase 数据更新架构OceanBase 租户架构登录系统租户通过 MySQL 客户端登录通过 OBClient 登录登录最佳实践登录用户租户登录 Meta 租户OceanBase 分布式数据库【信创/国产化…

UCOSIII章节介绍

UCOSIII章节介绍 一、第一部分&#xff08;第一章 至 第三十二章&#xff09;1、整体介绍2、单章介绍第一章 至 第三章&#xff1a;总体概览第四章 至 第五章&#xff1a;准备工作&#xff0c;配置KEIL工程环境第六章&#xff1a;准备工作&#xff0c;KEIL仿真介绍第七章&#…

怎么把试卷答案去掉再打印出来?

在学习中&#xff0c;试卷无疑是检验学习成果的重要工具。然而&#xff0c;当我们想重新练习这些试卷&#xff0c;加深对知识点的理解和记忆时&#xff0c;答案的存在往往会成为他们复习路上的“绊脚石”。那么&#xff0c;有没有一种方法可以轻松去除试卷上的答案&#xff0c;…

亚马逊云科技AWS将推出数据工程师全新认证(有资料)

AWS认证体系最近更新&#xff0c;在原有12张的基础上&#xff0c;将在2023年11月27日添加第13张&#xff0c;数据工程师助理级认证(Data Engineer Associate)&#xff0c;并且在2024/1/12前半价(省75刀&#xff1d;544人民币。 原有的数据分析专家级认证(Data Analytics Specia…

Unity功能——开发中逻辑坐标和世界坐标是什么?

声明&#xff1a;本文为个人笔记&#xff0c;用于学习研究使用非商用&#xff0c;内容为个人研究及综合整理所得&#xff0c;若有违规&#xff0c;请联系&#xff0c;违规必改。 Unity功能——逻辑坐标和世界坐标 文章目录 Unity功能——逻辑坐标和世界坐标一.开发环境二.问题描…

qt-C++笔记之滑动条QSlider和QProgressBar进度条

qt-C笔记之滑动条QSlider和QProgressBar进度条 —— 2024-04-28 杭州 本例来自《Qt6 C开发指南》 文章目录 qt-C笔记之滑动条QSlider和QProgressBar进度条1.运行2.阅读笔记3.文件结构4.samp4_06.pro5.main.cpp6.widget.h7.widget.cpp8.widget.ui 1.运行 2.阅读笔记 3.文件结构…

RuoYi-Vue-Plus (SPEL 表达式)

RuoYi-Vue-Plus 中SPEL使用 DataScopeType 枚举类中&#xff1a; /*** 部门数据权限*/DEPT("3", " #{#deptName} #{#user.deptId} ", " 1 0 "), PlusDataPermissionHandler 拦截器中定义了解析器&#xff1a; buildDataFilter 方法中根据注解的…

[LitCTF 2023]Ping、[SWPUCTF 2021 新生赛]error、[NSSCTF 2022 Spring Recruit]babyphp

[LitCTF 2023]Ping 尝试ping一下127.0.0.1成功了&#xff0c;但要查看根目录时提示只能输入IP 查看源代码&#xff0c;这段JavaScript代码定义了一个名为check_ip的函数&#xff0c;用于验证输入是否为有效的IPv4地址。并且使用正则表达式re来匹配IPv4地址的格式。 对于这种写…

机器学习:基于Sklearn、XGBoost框架,使用逻辑回归、支持向量机和XGBClassifier预测帕金森病

前言 系列专栏&#xff1a;机器学习&#xff1a;高级应用与实践【项目实战100】【2024】✨︎ 在本专栏中不仅包含一些适合初学者的最新机器学习项目&#xff0c;每个项目都处理一组不同的问题&#xff0c;包括监督和无监督学习、分类、回归和聚类&#xff0c;而且涉及创建深度学…

【已解决】Python Selenium chromedriver Pycharm闪退的问题

概要 根据不同的业务场景需求&#xff0c;有时我们难免会使用程序来打开浏览器进行访问。本文在pycharm中使用selenium打开chromedriver出现闪退问题&#xff0c;根据不断尝试&#xff0c;最终找到的问题根本是版本问题。 代码如下 # (1) 导入selenium from selenium import …