【面试干货】String、StringBuilder、StringBuffer 的区别

【面试干货】String、StringBuilder、StringBuffer 的区别

  • 1、String
  • 2、StringBuffer
  • 3、StringBuilder
  • 4、性能对比
  • 5、使用建议


💖The Begin💖点点关注,收藏不迷路💖

在Java中,String、StringBuilder和StringBuffer是用于处理字符串的常用类。虽然它们都表示字符串,但在使用方式和性能上存在一些重要的区别。

1、String

1、字符串常量: String类表示的是字符串常量,一旦创建后就不能被修改(不可变)

2、内存使用: 由于String的不可变性,每次对String进行修改(如拼接)操作,实际上都会创建一个新的String对象,这可能会导致大量的临时对象被创建,从而影响性能。

3、线程安全: 由于String的不可变性,它是 线程安全 的。

下面是一个简单的示例,展示了字符串拼接时会创建不同的对象:

package com.example;public class StringConcatenationExample {public static void main(String[] args) {String str1 = "Hello";String str2 = "World";// 使用 + 进行字符串拼接String result = str1 + str2;// 输出原始字符串和拼接后的字符串System.out.println("str1: " + str1); // HelloSystem.out.println("str2: " + str2); // WorldSystem.out.println("result: " + result); // HelloWorld// 比较内存地址System.out.println("str1 == result: " + (str1 == result)); // falseSystem.out.println("str2 == result: " + (str2 == result)); // false}
}

在这里插入图片描述
使用 StringBuilder 优化上面字符串拼接:

对于频繁的字符串拼接操作,建议使用 StringBuilder 或 StringBuffer 类,因为它们是可变的对象,支持高效地进行字符串拼接操作,不会创建大量临时对象。

以下是使用 StringBuilder 的示例:

public class StringBuilderExample {public static void main(String[] args) {String str1 = "Hello";String str2 = "World";// 使用 StringBuilder 进行字符串拼接StringBuilder sb = new StringBuilder();sb.append(str1);sb.append(str2);// 获取拼接后的字符串String result = sb.toString();// 输出原始字符串和拼接后的字符串System.out.println("str1: " + str1); // HelloSystem.out.println("str2: " + str2); // WorldSystem.out.println("result: " + result); // HelloWorld}
}

在这里插入图片描述
使用 StringBuilder 来进行字符串拼接,这避免了创建大量临时对象,提高了性能。

2、StringBuffer

1、字符串变量: StringBuffer类表示的是字符串变量,其对象的内容是可以修改的(可变)

2、内存使用: 使用StringBuffer进行字符串拼接时,不需要创建新的对象,而是在原有对象的基础上进行追加操作,从而提高了性能

3、线程安全: StringBuffer是线程安全的,它内部的每一个方法都使用了synchronized关键字进行同步,因此可以在多线程环境下安全地使用。

示例:

public class StringBuilderExample {public static void main(String[] args) {// 创建一个 StringBuilder 对象并初始化为 "Hello"StringBuilder sb = new StringBuilder("Hello");// 使用 append 方法在原有对象上追加内容sb.append(" World");// 获取拼接后的字符串String result = sb.toString();// 输出拼接后的字符串System.out.println(result); // Hello World}
}

3、StringBuilder

1、字符串变量: 与StringBuffer类似,StringBuilder也表示字符串变量,其内容也是可以修改的(可变)

2、内存使用: StringBuilder在内存使用上与StringBuffer相同,都是在原有对象上进行追加操作,从而提高了性能。

3、线程安全: 与StringBuffer不同,StringBuilder是线程非安全的。 因此,在多线程环境下使用StringBuilder可能会导致数据不一致或其他线程安全问题。但在单线程环境下,StringBuilder的性能通常优于StringBuffer。

示例:

public class StringBuilderExample {public static void main(String[] args) {// 创建一个 StringBuilder 对象并初始化为 "Hello"StringBuilder sb = new StringBuilder("Hello");// 使用 append 方法在原有对象上追加内容sb.append(" World");// 获取拼接后的字符串String result = sb.toString();// 输出拼接后的字符串System.out.println(result); // 输出: Hello World}
}

4、性能对比

1、StringBuilder的执行效率高于StringBuffer:由于StringBuffer是线程安全的,其内部方法使用了synchronized进行同步,这在一定程度上降低了其性能。而StringBuilder没有同步开销,因此在单线程环境下性能更高。

2、StringBuffer和StringBuilder的性能都高于String:由于String的不可变性,每次修改都会创建新的对象,而StringBuffer和StringBuilder都是在原有对象上进行修改,因此性能更高。

5、使用建议

1、对于大量字符串拼接操作建议使用StringBuffer或StringBuilder,以提高性能。

2、多线程环境下 如果需要在多线程环境下进行字符串拼接,建议使用StringBuffer;

3、在单线程环境下: 建议使用StringBuilder以提高性能

3、对于简单的字符串操作: 如果字符串操作不复杂,且不需要频繁修改字符串内容,可以直接使用String。
在这里插入图片描述


💖The End💖点点关注,收藏不迷路💖

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

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

相关文章

Linux经典常见常用命令50条

文章目录 基础命令1. ls2. cd3. pwd4. cp5. mv6. rm7. echo8. cat9. head10. tail 系统信息与管理命令11. ps12. top13. htop14. kill15. df16. du17. uname18. hostname19. uptime20. who21. man 文件权限与所有权命令22. chmod23. chown 网络管理命令24. ping25. ifconfig26.…

MySQL面试重点-1

1. 数据库基础知识: DDL、DML、DQL、DCL的概念与区别? DDL(数据定义语言):创建(CREATE)数据库中的各种对象:表、视图、索引等DML(数据操纵语言)&#xff1a…

Vue53-Todo-list案例

一、需求: 二、组件的划分:按照功能划分 组件起名,不要和html内置元素重名! Vue鼓励组件名用多个单词。 三、组件化编码流程 3-1、实现静态组件 将各个组件的基本框架写好,并在App.vue文件中进行引入和注册。 将已有…

[Day 8] 區塊鏈與人工智能的聯動應用:理論、技術與實踐

智能合約與去中心化應用 智能合約(Smart Contracts)是一種基於區塊鏈技術的程式碼,旨在自動執行、驗證或執行合約的內容或執行條款。透過智能合約,合約中的各方可以在無需第三方信任的情況下進行交易,實現自動化、透明…

AI数据分析:集中度分析和离散度分析

在deepseek中输入提示词: 你是一个Python编程专家,要完成一个Python脚本编写的任务,具体步骤如下: 读取Excel表格:"F:\AI自媒体内容\AI行业数据分析\toolify月榜\toolify2023年-2024年月排行榜汇总数据.xlsx&qu…

UniVue第一个版本发布说明

今天终于发布第一个版本了,爆肝了这么多天,对之前的代码优化重构,今天终于做完了,第一个版本的核心基础功能已经全部完成! github仓库 稳定版本仓库:https://github.com/Avalon712/UniVue 开发版本仓库&…

196. 删除重复的电子邮箱

196. 删除重复的电子邮箱 题目链接:196. 删除重复的电子邮箱 代码如下: # Write your MySQL query statement below delete from Person as p where p.id not in(select e.id from (select min(id) as idfrom Person group by email ) as e )

(二十一)Java 之多态

目录 一. 前言 二. 多态 2.1. 实例入手 2.2. 虚方法 三. 多态的实现方式 四. 课后习题 一. 前言 多态是同一个行为具有多个不同表现形式或形态的能力。 多态性是对象多种表现形式的体现。 比如我们说“宠物”这个对象,它就有很多不同的表达或实现,…

web前端五行属性:深入探索与实战解析

web前端五行属性:深入探索与实战解析 在Web前端开发中,五行属性这一概念或许听起来有些陌生。然而,如果我们将其与前端开发的核心理念相结合,就能发现其中蕴含的深刻内涵。本文将从四个方面、五个方面、六个方面和七个方面&#…

QT图片转PNG项目实战(含源码)

一、需求说明 最近在换工作,都需要将所有的图片,例如身份证、毕业证等信息都需要合并到一个pdf中。找了软件发现几乎都需要收费,干脆就自己写一个好了。 功能说明如下: 支持鼠标拖动加载图片,可以从桌面将图片类型的文件拖到软件中,一次最多添加150张。支持点击菜单中的…

树莓派4B刷入KODI作为机顶盒

LibreELEC Raspberry - LibreELEC Download - OSMC 使用LibreELEC USB-SD Creator进行系统烧写, LibreELEC USB-SD Creator下载地址 因为Kodi语言包是以插件的形式存在,不是集成到安装包里,有时候网络原因不能连接到Kodi的服务器&#xff…

爬虫初学篇

初次学习爬虫,知识笔记小想 目录🌟 一、🍉基础知识二、🍉http协议:三、🍉解析网页(1) xpath的用法:(2) bs4解析器的解释:(3) python字符编码的错误:(4) 正则表达式&#…

如何在单个VPS上使用nginx、forever和crontab托管多个Node.js应用

遵循本教程的要求 您需要安装 nginx 和 Node.js,并且在 DigitalOcean 上已经有关于这些主题的教程: 如何安装 nginx 和 如何安装 Node.js。 此外,您应该已经拥有一个域名,以便将正在运行的 Node.js 服务映射到域名,而…

手把手教学!新一代 Kaldi: TTS Runtime ASR 实时本地语音识别 语音合成来啦

简介 本文向大家介绍如何在新一代 Kaldi的部署框架 **sherpa-onnx**中使用 TTS。 注:sherpa-onnx 提供的是一个TTS runtime, 即部署环境。它并不支持模型训练。 本文使用的测试模型,都是来源于网上开源的 VITS 预训练模型。 我们提供了 ONNX 导出的支持。如果你也有 VITS 预…

你应该知道的口语连读技巧

[共24课]连读弱读-发音课程已上线 第一课 辅音和元音的连读 linking consonant to vowel 辅音和元音连读 第二课 h和th的删除不读 h-删除|deletion|elision|drop he/her/have/here/him... them-->/əm/ 第三课 t的删去不读(1) t-deletion|elision(1) drop t after…

GEO ISP图像调试-PFC(蓝紫边校正)

目录 1、简单介绍 2、调试策略 3、输出结果 1、简单介绍 GEO中中调整图像蓝紫边可分为两步,第一步:调整蓝紫边检测区域,第二步:设置去蓝紫边强度。 2、调试策略 图1 该图像蓝紫边较严重 主要原因是由于蓝紫边检测不准导致的&…

Java7之后的Java版本主要升级内容

自Java 7之后,Java的各个版本引入了许多重要的特性和改进。以下是Java 8到Java 17每个版本的主要升级内容: Java 8 (2014) Java 8 是一个具有重大里程碑意义的版本,包含了许多重要的特性和改进: Lambda 表达式:引入…

从零制作一个docker的镜像

近期docker的镜像仓库不好用了,很多国内的源也无法使用了,所有今天给大家分享一下怎么从零制作一个CentOS镜像。 准备CentOS7最小环境 mkdir /centos7.9-root# 在该目录准备centos的最小环境 sudo yum --installroot/centos7.9-root --releasever7 ins…

【面试题】MySQL常见面试题总结

备战实习,会定期给大家整理常考的面试题,大家一起加油! 🎯 系列文章目录 【面试题】面试题分享之JVM篇【面试题】面试题分享之Java并发篇【面试题】面试题分享之Java集合篇(三) 注意:文章若有错…

杂谈-C和C++有什么不同

C和C是两种流行的编程语言,它们在很多方面都有相似之处,但也有很多关键的区别。以下是对C和C之间差异的详细比较,旨在清晰地解释两者之间的不同点。 一、设计思想和语法规范 设计思想: C语言:C语言是一种面向过程的语…