【面试干货】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); // Hello
        System.out.println("str2: " + str2); // World
        System.out.println("result: " + result); // HelloWorld

        // 比较内存地址
        System.out.println("str1 == result: " + (str1 == result)); // false
        System.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); // Hello
        System.out.println("str2: " + str2); // World
        System.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.mfbz.cn/a/716132.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

是否要把展会客户引到国际站等付费平台?

有人问我:那些在展会来的客户,如果让我们发网站链接,是否要发公司的付费平台,比如阿里,中国制造网等? 我的建议是不要发,最好是发公司的官网链接。接着她说公司在付费平台上更新得比较频繁&…

湖北省小学毕业学籍照片采集流程及教师手机拍摄方法说明

随着教育信息化的不断推进,学籍管理也越来越规范和便捷。湖北省小学毕业学籍照片采集作为学籍管理的重要组成部分,对于确保学生信息的准确性和完整性具有重要意义。本文将详细介绍湖北省小学毕业学籍照片采集的流程,并提供教师使用手机拍摄照…

KKT基础知识

KKT条件定义 KKT条件(Karush–Kuhn–Tucker conditions)是最优化(特别是非线性规划)领域最重要的成果之一,是判断某点是极值点的必要条件。 最优化问题 要选择一组参数(变量),在满足一定的限制条件&…

个人云服务器已经被安全合规等卡脖子 建议不要买 买了必定后悔 安全是个大问题 没有能力维护

我的想法 自己买一个云服务器,先自己边做边学习,向往硅谷精神,财富与自由。如果能赚钱,就开个公司。这次到期就放弃了。 我前前后后6年花6000多元买云服务器。业余花了无数的精力,从2018到现在 ,也没有折…

【代码随想录——动态规划——第三周】

1.目标和 这里设置背包的最大长度为2100即可,因为题目中有说数组之和小于1000.但考虑到我们需要实行jnums[i]所以保守起见我们设置的数应该稍大于2000即可,这里我们设置为2100。 1.1 我的解法(粗糙了) func findTargetSumWays(n…

VMware安装Debian,Debian分区,虚拟机使用NAT模式联网,Linux设置静态IP

官网 https://www.debian.org/download stable是稳定版 win下amd64就行,macOs装arm架构的 安装Debian虚拟机 教程里没有的只管往下点就完了 哪个都行 选镜像 选安装位置 别超过宿主机内核就行 看你需求 NAT模式 虚拟 看你需求 其他的也检查一下 图形安装 选中文 继…

MoneyPrinterPlus:AI自动短视频生成工具,详细使用教程

MoneyPrinterPlus是一款使用AI大模型技术,一键批量生成各类短视频,自动批量混剪短视频,自动把视频发布到抖音,快手,小红书,视频号上的轻松赚钱工具。 之前有出过一期基本的介绍,但是后台收到有些小伙伴说,不知道如何使用。 今天我将会手把手的详细介绍…

1.动手学习深度学习课程安排及深度学习数学基础

视频资源B站:动手学习深度学习——李沐 目录 目标内容将学到什么1.N维数组样例2.访问2维数组元素3.数据操作4.线性代数5.矩阵计算6.自动求导 目标 介绍深度学习景点和最新模型 LeNet AlexNet VGG ResNet LSTM BERT… 机器学习基础 损失函数,目标函数&a…

抖音矩阵系统搭建,AI剪辑短视频,一键管理矩阵账号

目录 前言: 一、抖音矩阵系统有哪些功能? 1.AI智能文案 2.多平台账号授权 3.多种剪辑模式 4. 矩阵一键发布,智能发布 5.抖音爆店码功能 6.私信实时互动 7.去水印及外链 二、抖音矩阵系统可以解决哪些问题? 总结&#xff…

如何将接口返回/n替换为react.js中的换行符

将每个/n替换为ReactJS中的一个<br>标记。cpa_ability为后端返回的字段名

[js] 数字分开显示

<div id"number-container" class"number-container"></div>const number 123.45; // 要拆分的数字&#xff08;包括小数&#xff09; const numberContainer document.getElementById(number-container);// 将数字转换为字符串&#xff0c;…

IT架构思想---架构抽象

引言 架构的抽象思维这个概念很难解释&#xff0c;希望不会翻车&#xff0c;因为太抽象了.....&#xff0c;只能尽所能了。&#xff08;为了方便说明文章中的架构均指IT架构&#xff09; 抽象的定义 抽象是从众多的事物中抽取出共同的、本质性特征&#xff0c;而舍弃…

【二维差分】2132. 用邮票贴满网格图

本文涉及知识点 二维差分 LeetCode2132. 用邮票贴满网格图 给你一个 m x n 的二进制矩阵 grid &#xff0c;每个格子要么为 0 &#xff08;空&#xff09;要么为 1 &#xff08;被占据&#xff09;。 给你邮票的尺寸为 stampHeight x stampWidth 。我们想将邮票贴进二进制矩…

租房项目之并发缺失数据问题

前奏&#xff1a;本项目是一个基于django的租房信息获取项目。本次博客牵扯到两个版本&#xff0c;集中式分布以及分布式部署&#xff08;两个版本的ui不同&#xff0c;集中式用的是老版ui&#xff0c;分布式使用的是新版ui&#xff09;&#xff1b; 项目链接&#xff1a;http…

【C++提高编程-09】----C++ STL之常用排序算法

&#x1f3a9; 欢迎来到技术探索的奇幻世界&#x1f468;‍&#x1f4bb; &#x1f4dc; 个人主页&#xff1a;一伦明悦-CSDN博客 ✍&#x1f3fb; 作者简介&#xff1a; C软件开发、Python机器学习爱好者 &#x1f5e3;️ 互动与支持&#xff1a;&#x1f4ac;评论 &…

04 翼型和机翼、尾翼几何选择

04 翼型和机翼、尾翼几何选择 4 -1 引言4-2 翼型的选择4-2-1 翼型的几何4-2-2 翼型的升力和阻力4-2-3 翼型选择与设计4-2-4 设计升力系数4-2-5 失速4-2-6 翼型厚度比4-2-7 关于翼型其他方面的考虑 4-3 机翼几何外形4-3-1 展弦比4-2-3 机翼后掠角4-3-3 机翼稍根比4-3-4 机翼扭转…

echarts学习:使用dataset管理数据

前言 在我们公司的组件库中有许多echarts图表相关的组件&#xff0c;这些组件在使用时&#xff0c;只需将图表数据以特定的格式传入组件中&#xff0c;十分方便。因此当我得知echarts 可以使用dataset集中管理数据时&#xff0c;我就决定自己一定要搞懂它&#xff0c;于是在最…

第2章 Rust初体验6/8:Option枚举及其变体:能避免空指针异常问题:猜骰子冷热游戏

讲动人的故事,写懂人的代码 2.6 故事4: 一直让玩家不断猜 我们全班要一起用三种语言来写第4个故事啦。这可能是我们所有故事中最复杂的一个了。不过别担心,贾克强已经把这个故事的需求都用投影仪展示出来了。 程序会提示玩家猜两个骰子的点数之和。如果玩家第一次输入点数之…

C#反射机制介绍

文章目录 简介一、什么是反射二、反射的用途三、反射用到的命名空间及主要类四、Type类五、Assembly类六、使用反射实现上面的程序七、反射的优缺点 简介 这篇文章介绍了C#的反射机制&#xff0c;文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值&a…

DAY5-力扣刷题

1.两两交换链表中的节点 24. 两两交换链表中的节点 - 力扣&#xff08;LeetCode&#xff09; 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换…