Java StringBuilder

news2025/1/11 10:11:44

J a v a   S t r i n g B u i l d e r \huge{Java \space StringBuilder} Java StringBuilder

概述

S t r i n g B u i l d e r StringBuilder StringBuilder类是一种特殊的可变字符串的操作类,可以把它看做成一种特殊的对象容器。(简单讲的话就是一种特殊的字符串类型)

为什么要使用它?

既然 S t r i n g B u i l d e r StringBuilder StringBuilder类型是一种字符串类型,那么为什么不直接使用 S t r i n g String String类型呢?为什么还要这么麻烦呢?

因为字符串的操作使用 S t r i n g B u i l d e r StringBuilder StringBuilder类型为基础进行操作的话,效率疯狂提高❗❗
(具体怎么提高见后面的内存原理图)

如何使用它?

①. 构造器

在这里插入图片描述
示例:

StringBuilder sb = new StringBuilder();
//创建了一个StringBuilder里面不包含任何内容

或者构造器传入参数字符串 S t r i n g String String就可以进行特殊的初始化。

②. 常用方法

1. append()方法

a p p e n d ( ) append() append():在字符串后面添加数据并返回 S t r i n g B u i l d e r StringBuilder StringBuilder对象本身。(这点很重要,有关于后面的链式编程使用)

示例:

		//向空的StringBuilder对象sb中添加数据然后打印
        StringBuilder sb = new StringBuilder(); // ""
        sb.append("a");
        sb.append("b");
        sb.append("c");
        sb.append(1);
        sb.append(false);
        sb.append(3.3);
        sb.append("abc");
		//重写了toString()方法
        System.out.println(sb);

运行结果:
在这里插入图片描述
S t r i n g B u i l d e r StringBuilder StringBuilder a p p e n d ( ) append() append()还是很厉害的,代码中的多种数据类型都连接成 S t r i n g B u i l d e r StringBuilder StringBuilder类型了。
❗❗而且可以知道 S t r i n g B u i l d e r StringBuilder StringBuilder类型中的 t o S t r i n g ( ) toString() toString()方法也重写了。

a p p e n d ( ) append() append()也支持链式编程
示例:

StringBuilder sb1 = new StringBuilder();
// 支持链式编程
sb1.append("a").append("b").append("c").append("我爱你中国");
System.out.println(sb1);

为什么支持链式编程?
就像前面说的, a p p e n d ( ) append() append()方法会返回一个 S t r i n g B u i l d e r StringBuilder StringBuilder对象:
在这里插入图片描述
返回这个对象之后,继续.append(),进行添加,添加完之后继续.append()…,这就完成了链式编程。

2. reverse()方法

r e v e r s e ( ) reverse() reverse():反转 S t r i n g B u i l d e r ( ) StringBuilder() StringBuilder()类型中的数据。
在这里插入图片描述
并且返回这个对象!!(链式编程警觉!!)

3. length()方法

l e n g t h ( ) length() length():返回对象内容的长度。
在这里插入图片描述

❗❗❗❗4. toString()方法

t o S t r i n g ( ) toString() toString() S t r i n g B u i l d e r StringBuilder StringBuilder类型转换为 S t r i n g String String类型。(非常重要!!)

**背景:**因为在实际的开发中,所有的方法参数基本都是使用 S t r i n g String String类型的,比方说:

public static String fun(String str){
	...
}

这个方法的入参就是 S t r i n g String String类型,并且出参也是 S t r i n g String String类型,这个时候传入一个 S t r i n g B u i l d e r StringBuilder StringBuilder类型就会显得非常的奇怪。所以在实际的情况中, S t r i n g String String类型用交流的媒介, S t r i n g B u i l d e r StringBuilder StringBuilder类型用于当想要操作 S t r i n g String String类型时,进行操作的一个操作空间。

💥💥💥简而言之:所有的 S t r i n g B u i l e r StringBuiler StringBuiler类型进行增删改查操作的时候直接操作就好了,但是进行传参等操作的时候,必须转换成 S t r i n g String String类型!

示例:

		//整体的思想就是字符串操作就使用StringBuilder在这个空间中进行操作
		//但是传入方法的时候就换为String进行传参

        StringBuilder sb2 = new StringBuilder();
        sb2.append("123").append("456");
        // 恢复成String类型
        String rs = sb2.toString();
        check(rs);
	
		//入参为String类型的check方法
		public static void check(String data){
        	System.out.println(data);
    	}

内存原理

那么为什么需要大费周章的放到 S t r i n g B u i l d e r StringBuilder StringBuilder类型这个空间中进行操作呢?
因为节省资源!!
首先先说明 S t r i n g String String类型的+的底层逻辑:

public class Test{
	public static void main(String[] args) {
		String s1 = "a";
		String s2 = s1 + "b";
		String s3 = s2 + "c";
	}
}

上面这段代码最后表现出的结果就是s3 = "abc"但是内部的运行逻辑实际非常的复杂并且繁琐。
首先将方法载入到栈内存中:
在这里插入图片描述
首先现在字符串常量池中放入a,并且让s1指向a。完成了s1的赋值。之后读取到s2,首先会生成一个StringBuilder对象在堆内存中,然后进行加操作得到ab,之后在堆内存中生成一个String类型的数据,然后使用StringBuildertoString方法,将ab赋值给堆中的String,最后s2进行指向该Strings3同理。
堆中情况:
在这里插入图片描述
一句话:明面调用一次+,在内存中会产生两个对象,本质的原因是String类型直接进行操作在底层也还是转换为StringBuilder进行操作。(浪费内存空间

所以索性直接使用StringBuilder,在堆内存中产生一个对应的StringBuilder对象进行操作也就完啦!!

总结

S t r i n g B u i l d e r StringBuilder StringBuilder:可以理解为特殊的字符串,有很多的字符串操作方法,非常灵活(支持链式编程!),是 S t r i n g String String类型操作底层逻辑实现容器,可以节约很多的内存资源!!

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

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

相关文章

1、Spring简介与基于XML的IoC装配

一、Sping简介 1、概述 1、Spring是一个轻量级Java开发框架,最早有Rod Johnson创建,目的是为了解决企业级应用开发的业务逻辑层和其他各层的耦合问题。 2、Spring是一个面向对象设计层面的开发框架(基本上都是运行在后台)&#x…

从入门到进阶,KingbaseES数据库学习资料整理(持续归档中...)

一、安装和卸载 1.安装包 2.安装&卸载 3.安装、移除组件 4.license 5.安装问题 二、系统管理 1.初始化 2.数据库 3.快速开发管理工具 三、应用开发 1.sql 2.plsql 3.扩展和插件 4.接口 四、迁移 1.初始化和配置 2.迁移数据 3.迁移对象 4.迁移的异常处…

Linux网络原理与编程(2)——第十二节 应用层协议(以HTTP为例)

目录 协议 HTTP协议 认识URL HTTP协议的特征 HTTP的构成及报文格式 报文格式 请求方法 常见的Header 状态码 Cookie 我们从本节开始,就来正式地详细介绍网络各个层次的内容。 我们先从最顶端的应用层协议说起。 在说应用层协议之前,我们来思考…

Day42——Dp专题

文章目录五、多重背包六、背包问题总结动规五部曲背包递推公式遍历顺序18.打家劫舍19.打家劫舍II20.打家劫舍 III(dfs缓存/树形DP)五、多重背包 对于多重背包,我在力扣上还没发现对应的题目,所以这里就做一下简单介绍&#xff0c…

【SpringMVC】上篇,超详细的教程带你学会SpringMVC

✅作者简介:热爱Java后端开发的一名学习者,大家可以跟我一起讨论各种问题喔。 🍎个人主页:Hhzzy99 🍊个人信条:坚持就是胜利! 💞当前专栏:【Spring】 🥭本文内…

java面向对象----抽象类

目录 抽象类与抽象方法 概念 抽象类应用 接 口 概念 接口的特点: 接口应用举例 Java 8中关于接口的改进 内部类 如何声明局部内部类 局部内部类的特点 匿名内部类 总结 抽象类与抽象方法 概念 随着继承层次中一个个新子类的定义,类变得越…

android OTA update

可以使用系統的API來實現系統更新。分兩種更新,non-streaming 和 streaming。non-streaming就是把更新包下載好,放到本地,然後執行更新。而streaming是爲了你的設備內存不夠,不能把更新包下載下來,使用的,u…

Helm 部署 java 项目到 K8S

文章目录部署流程模板目录文件解析DeploymentServiceIngress_helpers.tplChart.yamlvalues.yaml部署命令部署流程 准备 jar 包使用 Dockerfile 构建镜像上传镜像到仓库(Harbor)使用 Helm 模板部署 jar 到 K8S 本文着重讲解第四步,如何制作 …

后分库分表时代的数据库新选择:二维火搭载OceanBase再出发

如今,在中国任意走进一家餐饮商户,不论其规模大小,扫码点餐、自助点餐机、商家点餐小程序等已经基本成为标配。随着餐饮行业数智化持续加速推进,餐饮 SaaS 已经逐渐成为商户们的“必选题”,二维火便是这“必选题”之一…

深度解析 Git 是如何工作的?

深度解析 Git 是如何工作的?前言Git 的特性Git 实际上是如何工作的Commits 对象Tree 对象Blobs 对象总结分支创建与合并代码合并与冲突代码合并算法(Myers)图搜索代码 diff结尾参考:《Pro Git》、《Advanced Git》 前言 Git 是一…

如何实现工具无关化?关于自动化测试脚本的设计

1.问题的提出 最近几年来,我的自动化测试工具之旅大致是这样的,最早用的是QTP,然后是RFT(IBM的功能测试自动化产品),之后也经历了Selenium, Watir等,再后还是一些商业工具主要是偏web自动化及移动自动化,如sahi, appnium, Keynot…

你知道ArcGIS电子地图也有大字体地图吗(附下载方法)

概述 如果你经常使用水经微图,应该知道在水经微图内,百度电子地图和高德电子地图有大字体地图,最近我偶然发现ArcGIS电子地图也有大字体地图,这里给大家介绍一下下载方法。 加载地图 在ArcGIS中打开目录窗格,点击添…

五、卷积神经网络CNN8(不同卷积后图像大小计算)

类型划分 2 维卷积的计算分为了 3 类:1.full 2.same 3. valid 1、full蓝色为原图像,白色为对应卷积所增加的 padding,通常全部为 0,绿色是卷积后图片。图中的卷积的滑动是从卷积核右下角与图片左上角重叠开始进行卷积&#xff…

为什么企业需要实时跟踪进度的项目管理工具?

市场上的大多数 项目管理工具,都是垃圾进-垃圾出,这意味着如果你的团队没有输入正确甚至漏了输入他们活动的状态信息,就无法准确跟踪项目进展。 当选择了一个不能跟踪实时进度状态的项目管理工具,它不能给你提供准确报告进度所需…

大型复杂项目管理之风险预防

最近一个项目让项目经理小王焦头烂额,一问才知是第一次主导大型项目,各个维度的风险问题频发不断,项目感觉推动不下去了。例如,子项目进度延误、项目资源不足、项目交付物质量不过关等因素造成项目的整体延误等等。 项目案例信息&…

GoogLeNet 与 Inception

本篇主要介绍GoogLeNet,其被改进并应用在了YOLOV1目标检测算法中。 GoogLeNet是google推出的基于Inception模块的深度神经网络模型,在2014年的ImageNet竞赛中夺得了冠军,在随后的两年中一直在改进,形成了Inception V2、Inception V3、Incepti…

Java 将PDF转为Word

众所周知,PDF文档除了具有较强稳定性和兼容性外, 还具有较强的安全性,在工作中可以有效避免别人无意中对文档内容进行修改。但与此同时,也妨碍了对文档的正常修改。这时我们可以将PDF转为Word文档进行修改或再编辑。使用软件将 PDF 文档转换为…

Spring事务,浅谈!

目录 一、EnableTransactionManagement工作原理 二、Spring事务基本执行原理 三、Spring事务详细执行流程 四、Spring事务传播机制 五、Spring事务传播机制分类 六、Spring事务强制回滚 七、TransactionSynchronization 一、EnableTransactionManagement工作原理 开启Spr…

在C++中,为什么部分程序员喜欢在循环中写‘++i’而不是‘i++’?

自入行以来,无论是查阅资料、技术博客亦或是同事间的技术交流,都有一个共识:在循环的时候,务必使用前置操作符,因为其性能优于后置操作符,久而久之,这个就像一个不成文的规定,大家都在遵循&…

C++异常介绍

目录 一.异常 1.1C异常概念 1.2异常的使用 1.3异常和栈帧,重新抛出 二.异常体系 2.1自定义异常体系 2.2C标准库的异常体系 2.3异常规范 3.异常的优缺点 3.1优点 3.2缺点 一.异常 1.1C异常概念 语言传统的处理错误的方式: 1. 终止程序,如assert…