【Java】String StringBuffer与StringBuilder(实操+面试+记忆方法)

news2024/12/25 1:50:59

Java系列文章目录

补充内容 Windows通过SSH连接Linux
第一章 Linux基本命令的学习与Linux历史


文章目录

  • Java系列文章目录
  • 一、前言
  • 二、学习内容:
  • 三、问题描述
  • 四、解决方案:
    • 4.1 代码学习与性能测试
      • 4.1.1 代码
      • 4.1.2 性能测试结果
    • 4.2 区别
  • 五、总结:
    • 5.1 使用场景
    • 5.2 关联记忆方法

一、前言

  • 面试中可能会遇到这个问题,实操加深印象

二、学习内容:

  • 学习StringStringBufferStringBuilder包含实操与理论面试

三、问题描述

  • 这三个的使用方法与区别
  • 使用场景

四、解决方案:

4.1 代码学习与性能测试

4.1.1 代码

  • 这三个常用方法学习

可手动写试试效果

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * 字符串操作演示类,展示Java中字符串的各种操作方法
 */
public class Main {
    /**
     * 程序入口
     * @param args 命令行参数
     */
    public static void main(String[] args) {
        // 演示正则表达式和字符串分割
        demonstrateRegexAndSplitting();
        // 演示字符串操作
        demonstrateStringManipulations();
        // 演示StringBuffer操作
        demonstrateStringBufferOperations();
        // 演示StringBuilder性能
        demonstrateStringBuilderPerformance();
    }

    /**
     * 演示正则表达式和字符串分割的用法
     */
    private static void demonstrateRegexAndSplitting() {
        // 使用正则表达式匹配字母和数字
        Matcher matcher = Pattern.compile("[a-zA-Z0-9]").matcher("www.1000phone.com");
        // 检查字符串是否完全匹配字母和数字
        String str1 = "www.1000phone.com";
        boolean matches = str1.matches("[a-zA-Z0-9]");
        System.out.println(matches);
        // 替换字符串中第一个出现的0为1
        System.out.println(str1.replaceFirst("0", "1"));
        // 将字符串中的%替换为1
        System.out.println(str1.replaceAll("%", "1"));

        // 字符串分割演示
        String str2 = "192.168.1.2.1";
        printSplitResults(str2, "\\.", -2);
        printSplitResults(str2, "\\.", -5);
        printSplitResults(str2, "\\.", 4);
        printSplitResults(str2, "\\.", 5);
    }

    /**
     * 打印字符串分割结果
     * @param str 待分割的字符串
     * @param delimiter 分割符
     * @param limit 分割结果限制,如果为负数,则不限制结果数量
     */
    private static void printSplitResults(String str, String delimiter, int limit) {
        String[] splitArray = str.split(delimiter, limit);
        for (String s : splitArray) {
            System.out.println("[" + s + "]");
        }
        System.out.println("===============");
    }

    /**
     * 演示字符串的基本操作,包括截取、大小写转换等
     */
    private static void demonstrateStringManipulations() {
        String str = "  1000ohone.com";
        // 去除字符串两端的空白字符
        System.out.println(str.trim());
        // 获取字符串的子字符串,从索引4开始到结尾
        System.out.println(str.substring(4));
        // 获取字符串的子字符串,从索引4开始到索引7结束
        System.out.println(str.substring(4, 7));
        // 将字符串转换为大写
        System.out.println(str.toUpperCase());
        // 将字符串转换为小写
        System.out.println(str.toLowerCase());
        // 分割线
        System.out.println("=======1000ohone.com=========");
    }

    /**
     * 演示StringBuffer的操作,包括追加、删除、插入和反转字符串
     */
    private static void demonstrateStringBufferOperations() {
        StringBuffer sb = new StringBuffer();
        // 追加字符串
        sb.append("Hello").append(" world");

        // 打印追加后的字符串
        System.out.println(sb);
        // 删除字符串中索引5到6之间的字符
        sb.delete(5, 6);
        System.out.println("字符串删除" + sb);
        // 在索引5处插入字符's'
        sb.insert(5, "s");
        System.out.println("字符串插入" + sb);
        // 反转字符串
        sb.reverse();
        System.out.println("字符串反转" + sb);

        // 分割线
        System.out.println("========StringBuffer========");
    }

    /**
     * 演示StringBuilder的性能,对比字符串直接拼接的方式
     */
    private static void demonstrateStringBuilderPerformance() {
        // 测量字符串直接拼接的性能
        long startTime = System.currentTimeMillis();
        String string = "";
        for (int i = 0; i < 50000; i++) {
            string += i;
        }
        long endTime = System.currentTimeMillis();
        System.out.println("执行时间" + (endTime - startTime) + "毫秒");

        // 测量StringBuilder拼接的性能
        startTime = System.currentTimeMillis();
        StringBuilder builder = new StringBuilder();
        for (int i = 0; i < 50000; i++) {
            builder.append(i);
        }
        endTime = System.currentTimeMillis();
        System.out.println("builder执行时间" + (endTime - startTime) + "毫秒");

        // 测量StringBuffer拼接的性能
        startTime = System.currentTimeMillis();
        StringBuffer buffer = new StringBuffer();
        for (int i = 0; i < 50000; i++) {
            buffer.append(i);
        }
        endTime = System.currentTimeMillis();
        System.out.println("buffer执行时间" + (endTime - startTime) + "毫秒");

        // 分割线
        System.out.println("========性能比较========");
    }

    /**
     * 生成具有指定属性的类代码
     * @param className 生成的类名
     * @param properties 属性列表,每个属性由类型和名称组成,用冒号分隔
     */
    private static void generate(String className, String... properties) {
        String voClassName = className + "VO";
        StringBuilder sb = new StringBuilder();
        // 生成类定义和属性以及getter和setter方法
        sb.append("public class ").append(voClassName).append("{\n");
        for (String property : properties) {
            String[] parts = property.split(":");
            String type = parts[0];
            String name = parts[1];
            sb.append("\tprivate ").append(type).append(" ").append(name).append(";\n");
            sb.append("\tpublic void set").append(capitalize(name)).append("(").append(type).append(" ").append(name).append(") {\n");
            sb.append("\t\tthis.").append(name).append(" = ").append(name).append(";\n");
            sb.append("\t}\n");
            sb.append("\tpublic ").append(type).append(" get").append(capitalize(name)).append("() {\n");
            sb.append("\t\treturn this.").append(name).append(";\n");
            sb.append("\t}\n");
        }
        // 打印生成的类代码
        System.out.println(sb.toString());
    }

    /**
     * 将字符串的第一个字符转换为大写
     * @param str 待转换的字符串
     * @return 转换后的字符串
     */
    private static String capitalize(String str) {
        if (str == null || str.isEmpty()) {
            return str;
        }
        // 返回转换后的字符串
        return str.substring(0, 1).toUpperCase() + str.substring(1);
    }
}

4.1.2 性能测试结果

⭐️ 可以看到相同条件下StringBuilder效率更高

结果不一定可能受其他因素影响,但相同条件StringBuilder效率更高是可以确定的

在这里插入图片描述

4.2 区别

StringBufferStringBuilder的区别:

  1. 可变性:

    • StringBufferStringBuilder对象的值是可以被修改
    • String对象的值是不可修改的所以也是线程安全。
  2. 线程安全性:

    • StringBuffer几乎所有的方法都使用synchronized实现了同步,因此是线程安全
    • StringBuilder没有实现同步,因此是非线程安全的。
  3. 性能:

    • StringBuffer在多线程系统中可以保证数据同步,但效率比较低
    • StringBuilder在单线程环境下效率较高,但在多线程环境下不安全

在实际开发中

  • 如果需要频繁修改字符串且要考虑线程安全,应该使用StringBuffer;
  • 如果不需要考虑线程安全且追求效率,可以使用StringBuilder。

五、总结:

面试回答

5.1 使用场景

(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据用 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据用 StringBuilder。

5.2 关联记忆方法

仅用作记忆

  • StringBuffer:Buff有增益的意思,与多线程相关,多线程来回调用效率更低
  • StringBuilder:反者记,这个就是单线程使用效率更高

(后续有遇到问题再添加)


声明:如本内容中存在错误或不准确之处,欢迎指正。转载时请注明原作者信息(麻辣香蝈蝈)。

在这里插入图片描述

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

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

相关文章

uniapp升级Vue3:避坑指南与步骤详解

为什么要升级到 Vue3 Vue3 是 Vue.js 的最新版本&#xff0c;相比 Vue2&#xff0c;它带来了许多改进和新特性&#xff0c;比如更小的包体积、更好的性能、更强大的组合式 API 等。通过升级到 Vue3&#xff0c;我们可以享受到这些新特性带来的好处&#xff0c;提升项目的开发效…

全国-住宅区AOI数据

数据量级&#xff1a;54万&#xff0c;更新时间&#xff1a;2024年3月 覆盖字段&#xff1a; 名称&#xff0c;地址&#xff0c;经纬度&#xff0c;一级分类&#xff0c;二级分类&#xff0c;三级分类&#xff0c;默认图片&#xff0c;AOI围栏 数据来源于&#xff1a;魔行观察…

从知识孤岛到知识共享:内部知识库如何促进团队协作

在当今快速变化的商业环境中&#xff0c;企业内部的知识管理和协作能力成为决定其竞争力的关键因素之一。然而&#xff0c;许多企业面临着“知识孤岛”的困境&#xff0c;即各部门和团队之间信息交流不畅&#xff0c;知识和经验难以有效传递和共享&#xff0c;导致资源浪费、决…

Sanster/IOPaint:AIGC大模型GFPGAN人像修复/美颜:修复历史人物老照片(3)

Sanster/IOPaint&#xff1a;AIGC大模型GFPGAN人像修复/美颜&#xff1a;修复历史人物老照片&#xff08;3&#xff09; 使用大模型GFPGAN进行人像修复/美颜&#xff0c;比如修复历史上某些人物的老照片。 一、首先pip安装组件依赖库&#xff1a; pip install gfpgan 二&…

大模型之三十-语音合成TTS(coqui)

TTS是text2speech的简称&#xff0c;TTS主要的一些常见包括小说、对话、视频配音、chatbot、虚拟人等场景&#xff0c;因coqui/XTTS-v2生成质量高、完全开源、多语言支持等特点&#xff0c;所以本篇基于coqui/XTTS-v2工具包浅出TTS。官方文档见[link]。 介绍 Coqui TTS 是一个…

形象化理解pytorch中的tensor.scatter操作

定义 scatter_(dim, index, src, *, reduceNone) -> Tensor pytorch官网说这个函数的作用是从src中把index指定的位置把数据写入到self里面&#xff0c;然后给了一个公式&#xff1a; self[index[i][j][k]][j][k] src[i][j][k] # if dim 0self[i][index[i][…

ROS CDK魔法书:建立你的游戏王国(TypeScript篇)

引言 在虚拟游戏的世界里&#xff0c;数字化的乐趣如同流动的音符&#xff0c;谱写着无数玩家的共同回忆。而在这片充满创意与冒险的乐园中&#xff0c;您的使命就是将独特的游戏体验与丰富的技术知识相结合&#xff0c;打造出令人难以忘怀的作品。当面对如何实现这一宏伟蓝图…

MOS管G极串联电阻的作用是什么

MOS管栅极串联电阻是如何抑制谐振? 为什么会震荡? 首先了解一下LC串联谐振电路,虽然,LC串联在电路中运用的并不多,但是在无意中总会形成串联谐振,从而产生很多各种各样的现象。如果不了解其本质,会让我们很难理解。比如,使用同样的LC电路滤波,用到两个电路上,有的电…

CCF推荐B类会议和期刊总结:(计算机体系结构/并行与分布计算/存储系统领域)

目录 前言 B类会议 1. SoCC 2. SPAA 3. PODC 4. FPGA 5. CGO 6. DATE 7. HOT CHIPS 8. CLUSTER 9. ICCD 10. ICCAD 11. ICDCS 12. CODESISSS 13. HiPEAC 14. SIGMETRICS 15. PACT 16. ICPP 17. ICS 18. VEE 19. IPDPS 20. Performance 21. HPDC 22. ITC…

在亚马逊云科技上利用Graviton4代芯片构建高性能Java应用(下篇)

简介 在AI迅猛发展的时代&#xff0c;芯片算力对于模型性能起到了至关重要的作用。一款能够同时兼具高性能和低成本的芯片&#xff0c;能够帮助开发者快速构建性能稳定的生成式AI应用&#xff0c;同时降低开发成本。今天小李哥将介绍亚马逊推出的4代高性能计算处理器Gravition…

计算机毕业设计Python电影评论情感分析 电影可视化 豆瓣电影爬虫 电影推荐系统 电影数据分析 电影大数据 大数据毕业设计 机器学习 深度学习 知识图谱

相关技术介绍 豆瓣电影数据采集与可视化分析系统是用当前应用很广泛的Python语言和Flask框架&#xff0c;并结合CSS与HTML搭建Web网页&#xff0c;使用MySQL数据库对数据进行存储&#xff0c;依次来开发实现系统的功能。本系统运行需要的软件有Pycharm、普通浏览器、Navicat f…

AD原理图update为pcb

首先&#xff0c;要在自己的项目下面创建好原理图和PCB&#xff0c;记得保存&#xff01;&#xff01;&#xff01; 点击设计>update 更新成功&#xff01;

数据结构-图-存储-邻接矩阵-邻接表

数据结构-图-存储 邻接矩阵 存储如下图1,图2 图1 对应邻接矩阵 图2 #include<bits/stdc.h> #define MAXN 1005 using namespace std; int n; int v[MAXN][MAXN]; int main(){cin>>n;for(int i1;i<n;i){for(int j1;j<n;j){cin>>v[i][j];}}for(int…

RM比赛常见的电机(直流无刷电机)

声明&#xff1a;个人笔记&#xff0c;仅供参考 一、M2006电机 M2006 P36 电机采用三相永磁直流无刷结构&#xff0c;具有输出转速高、体积小、功率密度高等特点。该电机内置位置传感器&#xff0c;可提供精确的位置反馈&#xff0c;以 FOC 矢量控制方式使电机产生连续的扭矩。…

Cannot Locate Document 原理图导入pcb出现报错

将原理图update到pcb时报错Cannot Locate Document&#xff1a; 记得保存pcb到你的项目就可以了

爬虫之淘宝接口获取||Python返回淘宝商品详情数据SKU接口

在学习爬虫的过程中&#xff0c;大多数的人都是些豆瓣&#xff0c;招聘网站什么的。这里给出一些工作上能够用得到的内容&#xff0c; 仅供大家参考。 本次需要看的是淘宝的接口&#xff0c; 这个接口与微博寻找接口的方式大致相同。请看详细的寻找方法。首先我们先在百度页面点…

python实现c4d的tp粒子在多个物体上发射思维粒子

基本状态思维粒子只能传入一个物体&#xff0c;在一个物体身上发射粒子。 场景如下&#xff0c;右边的multiEmitter的python标签里的python脚本执行后会在其下面生成数个从pt物体的拷贝&#xff0c;同时拷贝其上的XPresso标签及标签里的内容 下面是pt物体的XPresso标签标签的内…

[ RK3566-Android11 ] 关于 RK628F 驱动移植以及调试说明

问题描述 我这个项目的SDK比较老&#xff0c;移植RK628F最新驱动的调试过程&#xff0c;踩了很多坑&#xff0c;希望大家别踩坑。 解决方案&#xff1a; 首先在FTP上下载最新的RK628的驱动 rk628-for-all-v27-240730 版本。 下载完后 不要直接替换&#xff0c;不要直接替换&a…

Vue获取后端重定向拼接的参数

前言 比如我们要重定向这样一个连接&#xff1a; http://192.168.2.189:8081?nameadmin springboot重定向&#xff1a; Vue获取&#xff1a; getParam(param) {var reg new RegExp("(^|&)" param "([^&]*)(&|$)");var r location.searc…

计算机的错误计算(八十八)

摘要 探讨双曲反正切函数 atanh(x)的计算精度问题。 IEEE 754-2019 中含有 atanh(x)函数。其定义为 例1. 计算 atanh(0.9999999999997) . 不妨用 LibreOffice中的电子表格计算&#xff0c;则有&#xff1a; 若在线运行JavaScript代码&#xff1a; let result Math.atanh(0.…