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

news2024/10/5 23:26:59

【面试干货】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.coloradmin.cn/o/1830312.html

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

相关文章

云计算在保险行业的应用:太平财险团财险理赔新核心业务系统案例

随着科技的快速发展,云计算技术已经成为推动保险行业数字化转型的重要力量。云计算为保险公司提供了弹性、可扩展的计算资源,使其能够灵活应对业务高峰和低谷,提高业务运营效率和风控水平。太平财险与太平金科联合开发的“团财险理赔新核心业…

Synctv安装过程中遇到的docker镜像国内无法pull的问题

0x01 docker无法直接拉取对应镜像文件的问题 docker目前国内网络环境无法直接拉去小众而且稍微前沿的docker镜像产品,这对很多折腾玩家及其不友好,我首先想到了替换成国内的docker镜像站,但是对于SyncTV这个产品的docker镜像文件还是无法拉去…

志愿服务管理系统的设计

管理员账户功能包括:系统首页,个人中心,管理员管理,基础数据管理,广场论坛管理,志愿活动管理,活动报名管理 前台账户功能包括:系统首页,个人中心,志愿活动&a…

python GUI开发: tkinter事件处理的几种方式详解与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

代码随想录——分割回文串(Leetcode 131)

题目链接 回溯 class Solution {List<List<String>> res new ArrayList<List<String>>();List<String> list new ArrayList<String>();public List<List<String>> partition(String s) {backtracking(s, 0);return res;}p…

WebGL学习【焕新计划】

WebGL基础 在正式进入webgl之前&#xff0c;我想有必要简单了解一下渲染管线&#xff0c;毕竟它贯穿webgl学习的整个过程。 渲染管线流程图&#xff1a; webgl着色器简单语法&#xff1a; 在GLSL&#xff08;OpenGL Shading Language&#xff09;中&#xff0c;常见的变量类…

STM32程序启动过程

&#xff08;1&#xff09;首先对栈和堆的大小进行定义&#xff0c;并在代码区的起始处建立中断向量表&#xff0c;其第一个表项是栈顶地址&#xff08;32位&#xff09;&#xff0c;第二个表项是复位中断服务入口地址&#xff1b; &#xff08;2&#xff09;然后执行复位中断&…

HTML的常用标签

HTML&#xff08;补&#xff09; CSS选择器 元素选择器&#xff1a;指定一个标签给这个标签设置一个默认的样式。设置的样式对所有相同的标签都有用。 id选择器&#xff1a;我们可以给标签指定一个唯一的id&#xff0c;然后根据id可以在style标签中设置对应标签的样式元素。设…

3 高频小信号放大器

目录 高频小信号放大器的分类与质量指标 分类 质量指标 增益 通频带 选择性 稳定性 噪声系数 晶体管高频等效电路 混合Π等效电路 Y参数等效电路 混合Π与Y参数等效电路的转换 单级高频谐振小放 高频交流等效电路 单级高频谐振小放质量指标 增益 通频带 选择性…

Prometheus之图形化界面grafana与服务发现

前言 上一篇文章中我们介绍了Prometheus的组件&#xff0c;监控作用&#xff0c;部署方式&#xff0c;以及如何通过在客户机安装exporter再添加监控项的操作。 但是不免会发现原生的Prometheus的图像化界面对于监控数据并不能其他很好的展示效果。所以本次我们将介绍一…

RabbitMQ实践——利用随机交换器做负载均衡

大纲 启用Random Exchange创建Exchange绑定队列测试 在《RabbitMQ实践——利用一致性Hash交换器做负载均衡》中&#xff0c;我们使用了Consistent Hash Exchange实践了消息路由的负载均衡。本文我们将使用一种更简单的交换器来实现该功能&#xff0c;这就是“随机交换器”&…

图书馆图书可视化分析+大屏

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 目录 摘要前言技术栈开发环境数据说明 正文数据获取数据存储数据清理数据分析数据挖掘关联规则二分类预测 数据可视化书籍价格区间柱状图书籍评…

Python求子数组和的所有元素(附Demo)

目录 前言1. 暴力求解2. 前缀和哈希表3. 滑动窗口 前言 工作需要&#xff0c;对应需要优化查找子数组和等于特定值的算法 对应的算法推荐&#xff1a;子数组相关题目 以下算法主要针对Python 1. 暴力求解 双重循环时间复杂度为 O(n2) def subarrays_with_sum_equal_k(num…

项目干系人管理

目录 1.概述 2.四个子过程 2.1. 识别干系人&#xff08;Identify Stakeholders&#xff09; 2.2. 规划干系人参与&#xff08;Plan Stakeholder Engagement&#xff09; 2.3. 管理干系人参与&#xff08;Manage Stakeholder Engagement&#xff09; 2.4. 监督干系人参与&…

探究肥胖致血糖异常的原因与运动的意义

肥胖对身体血糖存在影响&#xff0c;原因主要在于以下两方面。 首先&#xff0c;肥胖者体内的脂肪组织大量积聚&#xff0c;会释放诸多有害物&#xff0c;对胰岛素的正常功能形成干扰&#xff0c;致使胰岛素抵抗加剧&#xff0c;从而造成血糖调节失常。 其次&#xff0c;肥胖往…

路由器虚拟服务器有什么作用

现如今在IPv4时代&#xff0c;由于公网IP地址的匮乏&#xff0c;约有70%的电脑都处于内网中&#xff0c;上网需要通过路由器。如果反过来想要访问身处内网的电脑&#xff0c;我们就需要在路由器里开放相应的端口才能实现。而这开放端口的功能&#xff0c;在路由器里就叫做虚拟服…

15.docker-compose(单机版的容器编排工具)

docker-compose(单机版的容器编排工具) 类似ansible剧本 安装docker-compose编排工具 yum install -y docker-compose #&#xff08;需要epel源&#xff09;##docker-compose配置文件详细指令详解&#xff0c;参考如下链接 http://www.jianshu.com/p/2217cfed29d7 上传两个d…

17.Meta AI 大模型家族 LLaMA

Meta LLaMA 1 大模型技术解读 LLaMA 1&#xff1a;小模型大数据 LLaMA 1 在万亿 Token 公开数据集上预训练 LLaMA 1 模型网络架构改进 大模型网络架构差异性配置总览 典型大模型网络架构对比 LLaMA 1 预训练超参数配置 典型大模型训练超参数对比 LLaMA 1 预训练效率提升与成本…

Linux shell 重定向输入和输出

Linux shell 重定向输入和输出 1. Standard I/O streams2. Redirecting to and from the standard file handles (标准文件句柄的重定向)2.1. command > file2.2. command >> file2.3. command 2> file2.4. command 2>> file2.5. command < file2.6. comm…