Java中的StringBuilder类功能详解

2023-10-30

----------- android培训java培训、java学习型技术博客、期待与您交流! ------------


字符串连接可以通过两种方法实现,其中一种是在Java中提供的一个StringBuilder类(这个类只在J2SE5及以上版本提供,以前的版本使用StringBuffer类)。

字符串是Java程序中最常用的一种数据结构之一。在Java中的String类已经重载的"+"。也就是说,字符串可以直接使用"+"进行连接,如下面代码所示:

String s = "abc" + "ddd"; 

但这样做真的好吗?当然,这个问题不能简单地回答yes or no。要根据具体情况来定。在Java中提供了一个StringBuilder类(这个类只在J2SE5及以上版本提供,以前的版本使用StringBuffer类),这个类也可以起到"+"的作用。那么我们应该用哪个呢?

下面让我们先看看如下的代码:

public class TestSimplePlus  
{
	public static void main(String[] args)
	{
		String s = "abc";
		String ss = "ok" + s + "xyz" + 5;
		System.out.println(ss); 
	}
} 

上面的代码将会输出正确的结果。从表面上看,对字符串和整型使用"+"号并没有什么区别,但事实真的如此吗?下面让我们来看看这段代码的本质。

我们首先使用反编译工具(如jdk带的javap、或jad)将TestSimplePlus反编译成Java Byte Code,其中的奥秘就一目了然了。

通过反编译得出的结果是:虽然在源程序中使用了"+",但在编译时仍然将"+"转换成StringBuilder。因此,我们可以得出结论,在Java中无论使用何种方式进行字符串连接,实际上都使用的是StringBuilder类。

那么是不是可以根据这个结论推出使用"+"和StringBuilder类的效果是一样的呢?这个要从两个方面的解释。如果从运行结果来解释,那么"+"和StringBuilder是完全等效的。但如果从运行效率和资源消耗方面看,那它们将存在很大的区别。

当然,如果连接字符串行表达式很简单(如上面的顺序结构),那么"+"和StringBuilder类基本是一样的,但如果结构比较复杂,如使用循环来连接字符串,那么产生的Java Byte Code(java字节码)就会有很大的区别。先让我们看看如下的代码:

public class TestStringBuilder
{
	public static void main(String[] args)
	{
		String s = "";
		Random rand = new Random();
		for (int i = 0; i <  10; i++)
		{
			result.append("a");
			result.append(" ");
		}
		System.out.println(result.toString());
	}
} 

上面的代码返编译后可知,虽然编译器将"+"转换成了StringBuilder类,但创建StringBuilder对象的位置却在for语句内部。这就意味着每执行一次循环,就会创建一个StringBuilder对象(对于本例来说,是创建了10个StringBuilder对象),虽然Java有垃圾回收器,但这个回收器的工作时间是不定的。如果不断产生这样的垃圾,那么仍然会占用大量的资源。解决这个问题的方法就是在程序中直接使用StringBuilder类来连接字符串,代码如下:

public class TestStringBuilder
{
	public static void main(String[] args)
	{
		StringBuilder result = new StringBuilder();
		for (int i = 0; i <  10; i++)
		{
			result.append("a");
			result.append(" ");
		}
		System.out.println(result.toString());
	}
}

创建StringBuilder的代码被放在了for语句外。虽然这样处理在源程序中看起来复杂,但却换来了更高的效率,同时消耗的资源也更少了。

在使用StringBuilder类时要注意,尽量不要"+"和StringBuilder混着用,否则会创建更多的StringBuilder对象,如下面代码所:

for (int i = 0; i <  10; i++)
{
	result.append(rand.nextInt(1000));
	result.append(" ");
}
改成:

 for (int i=0;i<10;i++)
 {
	 result.append(rand.nextIne(1000) + "")
 }

如果将上面的代码在JDK1.4下编译,必须将StringBuilder改为StringBuffer,而JDK1.4将"+"转换为StringBuffer(因为JDK1.4并没有提供StringBuilder类)。StringBuffer和StringBuilder的功能基本一样,只是StringBuffer是线程安全的,而StringBuilder不是线程安全的。因此,StringBuilder的效率会更高。







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java中的StringBuilder类功能详解 的相关文章

  • 如何使用 IO Codenameone 发布图片/图像

    因为 codenameone 不能使用外部库 HttpConnection 所以我必须使用 Codenameone 提供的内部库 API 只是我已经设法使用 ConnectionRequest 将数据发布到格式化文本 字符串 我想知道是否有
  • 如何以编程方式检查应用程序是否在调试模式下运行?

    我必须在应用程序中的某个位置确定我的应用程序是在调试模式还是实时模式下运行 是否有任何函数或代码可用于检查 在开 关两种情况下都会返回 true false 如果是这样 请帮助我 提前致谢 从问题中尚不清楚调试模式是否指的是 应用程序是否可
  • 如何使用 log4j 自动记录类中调用的每个方法

    我有一个包含数据库调用的类 我通常希望使用 log4j 记录该类中调用的每个方法 带参数 logger debug foo id id initiated 可以自动执行此操作吗 也许通过在每个方法的开头使用某种注释而不是编写每个 logge
  • java中如何围绕另一个移动对象旋转一个对象?

    我对 Java 很陌生 想要编写一个简单的太阳系统 其中月球绕地球旋转 地球绕太阳旋转 一切正常 除了月亮不想正确移动 由于地球偏离月球的初始位置 月球的自转半径会根据该距离而增大 同样 当地球接近月球惯性位置时 自转半径会减小 如果初始位
  • 仅使用 ServletContext 查找应用程序的 URL

    我正在使用 Spring MVC 编写一个 Java Web 应用程序 我有一个后台进程 它会遍历数据库并查找必须通过电子邮件发送给我的用户的通知 这些电子邮件需要包含应用程序的超链接 对于网络应用程序来说 这似乎是相当常见的模式 但我遇到
  • 将 Spring Boot 应用程序部署到 Heroku 失败并显示“无效标志:--release -> [帮助 1]”

    当我尝试将代码部署到 Heroku 时 通过git push heroku master 我收到 Maven 错误 remote ERROR Failed to execute goal org apache maven plugins m
  • 带有 spring-kafka 的 Kafka 死信队列 (DLQ)

    最好的实施方式是什么死信队列 DLQ Spring Boot 2 0 应用程序中的概念 使用 spring kafka 2 1 x 来处理无法处理的所有消息 KafkaListener某些bean发送到某些预定义的Kafka DLQ主题的方
  • 如何在 Android 中将 EditText 绘制到画布上?

    我想画画 EditText username new EditText context 到我画布上的特定位置 protected void onDraw Canvas canvas 是否可以在基础上画出x y在我的 Java 文件中协调而不
  • Spring Batch:比较数据库之间的数据

    我有两个数据库 Oracle 和 MySQL 目标是将Oracle表中的值保存到MySQL中 要求 MySQL表中不存在数据 但我在理解 Spring Batch 时遇到了困难 步骤中 它包含itemReader itemProcessor
  • java.sql.SQLException: - ORA-01000: 超出最大打开游标数

    我收到 ORA 01000 SQL 异常 所以我有一些与之相关的疑问 最大打开游标是否与 JDBC 连接数完全相关 或者它们也与我们为单个连接创建的语句和结果集对象相关吗 我们正在使用连接池 有没有办法配置数据库中语句 结果集对象的数量 如
  • 从外部 clojar 导入/使用资源

    我想做的是将一个大文件 MIDI 声音字体 打包到一个独立的 Maven repo clojar 中 然后能够以编程方式将其拉下来并从单独的项目中使用它 事实证明 这个看似简单的任务比我想象的要复杂 理想的情况是 如果有一种方法可以直接访问
  • 如何在最短的时间内克隆java中的输入流

    有人可以告诉我如何克隆输入流 并花费尽可能少的创建时间吗 我需要多次克隆输入流以使用多种方法来处理 IS 我尝试了三种方法 但由于这样或那样的原因 事情不起作用 方法 1 感谢 stackoverflow 社区 我发现以下链接很有帮助 并将
  • Java 中 LINQ 的等价物是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 中 LINQ 的等价物是什么 没有什么比 LINQ for Java 更好的了 Edit 现在
  • JFreeChart MeterPlot

    我目前正在用java做Agent项目 在某些时候 我需要显示一个仪表 例如 电池电量 我的程序中有 5 个代理 每个代理都会创建自己的带有名称的仪表图 但不知何故他们没有更新数据集 或者他们正在更新数据集 只是它没有显示在仪表图上 任何想法
  • ObservableList 不更新 ArrayList

    对于学校作业 我们正在使用 JavaFX 中的 ObservableList 对象 对吗 我已经为此工作了一天多了 但无法弄清楚 老师只告诉我们 谷歌一下 所以这也没有帮助 基本上 我们正在开发一个基本的管理应用程序来跟踪人们及其家人 人们
  • Android:如何以编程方式仅圆化位图的顶角?

    我目前正在使用这段代码 Override public Bitmap transform Bitmap source Bitmap result Bitmap createBitmap source getWidth source getH
  • 如何实现再次播放功能?

    我希望在游戏结束时得到提示 如果我还想再玩一次的话 并使用 Y N 输入 退出游戏或重复游戏 我该如何以最有效的方式解决这个问题 编辑 描述资源路径位置类型 类型 Main Main java ScaredyCat src se grupp
  • Spring Data JPA 和 Exists 查询

    我正在使用 Spring Data JPA 使用 Hibernate 作为我的 JPA 提供程序 并想要定义一个exists附加 HQL 查询的方法 public interface MyEntityRepository extends C
  • SAXParseException:找不到元素“定义”的声明

    我对 camunda 和 DMN 完全陌生 我试图在 spring boot 中运行 DMN 示例 链接在这里 https github com camunda camunda bpm examples tree master dmn en
  • 当我必须在 Netty4 编码器中调用 ByteBuf.retain() 时?

    我正在编写一个以 NUL 终止 JSON 消息的编码器 以便在消息碎片的情况下可以对其进行解码 我找到了这个样本 gt click https github com netty netty blob master codec src mai

随机推荐

  • Python时间处理

    在这里想做一个初学者的教程 会不断的更新下去 把学到的有关Python时间处理的内容总结起来 初学者笔记最重要的有两点 一个是要简洁 不要长篇大论 把要点讲明白就行 第二个是要符合二八原则 尽量抓住关键的东西 不要过分的追求大而全 优先掌握
  • 微信小程序的默认目录结构&微信小程序中封装request请求

    默认目录结构 pages wxml 编写小程序界面结构的地方 wxss 编写小程序样式的地方 json 编写界面配置的地方 js 编写界面逻辑的地方 utils 编写工具类的地方 app js 创建程序实例的位置 app json 编写全局
  • Predicate接口

    package cn dali5 code05 import java util function Predicate Predicate
  • Tesseract编译及使用(windows vs 2017)

    Tesseract编译及使用 尊重他人的劳动转载请标注 资源准备 Vs2010或者更高版本 本教程使用vs2017 Tesseract源码 Git下载 或者直接从我的下载资源下载 Git主页 地址https github com tesse
  • VMware Workstation player 安装CentOS实践

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 本文实践在windows系统的VMware Workstation player上安装CentOS 7系统 并对新安装的CentOS 最小化安装 系统做一些基本的配置 一
  • 配置JAVA_HOME

    配置JAVA HOME 1 新建系统环境变量JAVA HOME变量值为C Program Files Java jdk 12 0 1 2 编辑Path添加 JAVA HOME bin 3 新建系统环境变量CLASSPATH 变量值为 Jav
  • 火狐浏览器手势全屏

    先下载一个扩展Gesturefy 管理扩展 添加手势
  • 如何利用cpolar-内网穿透工具,从家里或外网访问您的树莓派 Raspberry Pi

    假如你曾尝试将树莓派 Raspberry Pi 设置成为物联网设备 你就会知道 除非你跳过一大堆恼人的内网穿透问题 否则你就无法在本地网络上提供网页和数据 从家庭或本地网络外部访问树莓派可能是一项挑战 在工作或学校时通过手机访问家中的树莓派
  • Redis配置序列化反序列化Jackson ObjectMapper 中的 enableDefaultTyping 方法从 2.10.0 开始标记为过期

    Spring Boot 整合 Redis 时 我们经常用 Jackson2JsonRedisSerializer 替换原来的 Serializer 代码一般如下 Bean SuppressWarnings value unchecked r
  • asp.net 实现购物车详细代码

  • 九、索引与执行计划、索引的分类

    索引与执行计划 索引入门 生活中的索引 MySql 中的索引 谈下 B Tree 二分查找 二叉树 Binary Tree 平衡二叉树 AVL 树 平衡二叉树的遍历 平衡二叉树的旋转 B 树 B 树的定义 B 树的作用 B 树的插入操作 索
  • 《试用》--项目总结

    一 前言 临时来了一个需求 做一个试用 只支持微信打开 的项目 就是我们提供为商家提供一个试用的平台 商家把淘宝上卖的商品放到我们的平台免费给用户试用 用户可以在我们商城去寻找的合适的产品进行申请试用 按照任务流程申请 获得领取资格后 去指
  • 母函数

    模板 初始化a 因为有last 所以这里无需初始化其他位 a 0 1 int last 0 for int i 0 i
  • android 屏幕亮度广播,Android视频播放器屏幕左侧边随手指上下滑动亮度调节变暗变亮原理实现详解...

    Java代码 package zhangphil app import android app Activity import android os Bundle import android view LayoutInflater imp
  • 渐变维度入门.

    有一张内容提供商表 如图 需要做维度渐变 渐变列这里做了简化 只有Cpname 维度表如下 多了三列 维度开始时间 结束时间 以及是否是当前值 渐变的设置如下 1 2 在这里我们强调一下图2的几列意思 固定的属性 用的比较少 不做解释 变化
  • Nginx(7)Nginx实现服务器端集群搭建

    Nginx集群搭建 Nginx与Tomcat部署 Nginx实现动静分离 Nginx实现Tomcat集群搭建 Nginx高可用解决方案 Keepalived Keepalived配置文件 keepalived之vrrp script Ngi
  • 爬虫入门教程(非常详细)从零基础入门到精通,看完这一篇就够了

    01 Python优势 对于网络爬虫开发来说 Python有着无与伦比天然优势 这里从两个方面对其优势进行分析与讲解 1 抓取网页本身的接口 相比其他静态编程语言 如java c 与c Python抓取网页文档的接口更简洁 而对比其他动态脚
  • chrome设置黑暗模式的4种方法

    chrome设置黑暗模式的4种方法 前言 方式一 自带皮肤暗黑 具体操作 效果 方式二 自带内容暗黑 具体操作 效果 方式三 安装chrome主题 方式四 使用插件 效果 额外 开发工具的暗黑设置 结语 前言 对于大部分chrome用户来说
  • Qt Tcp网络编程

    1 Qt中的TCP客户端编程 Qt中的TCP客户端编程 对于Qt编程而言 网络只是数据传输的通道 Qt提供了QTcpSocket类 封装了TCP协议细节 将QTcpSocket的对象当做黑盒使用 进行数据收发 QTcpSocket的使用方式
  • Java中的StringBuilder类功能详解

    android培训 java培训 java学习型技术博客 期待与您交流 字符串连接可以通过两种方法实现 其中一种是在Java中提供的一个StringBuilder类 这个类只在J2SE5及以上版本提供 以前的版本使用StringBuffer