sb.append(a + b);与sb.append(a).append(b); 详解

news2024/11/17 21:04:17

在 Java 中,sb.append(a + b)sb.append(a).append(b) 都是通过 StringBuilder 实现字符串拼接的两种方式,但它们的执行机制性能可能不同,具体取决于变量 ab 的类型。以下是详细解析:


1. sb.append(a + b) 的行为

在这种写法中,a + b 先在 append 方法调用之前进行运算,然后将结果作为整体传递给 append 方法。

情况 1:ab 是数字类型(如 intdouble
  • 过程

    • 编译器将先计算 a + b 的数值结果。
    • 然后将这个结果传递给 StringBuilder.append
  • 示例

    int a = 10, b = 20;
    StringBuilder sb = new StringBuilder();
    sb.append(a + b); // 等价于 sb.append(30);
    System.out.println(sb.toString()); // 输出 "30"
    
  • 性能

    • 运算 a + b 是一个基本的加法操作,开销非常低。
    • 整体上性能较好。

情况 2:ab 是字符串类型
  • 过程

    • 由于 + 在 Java 中对字符串重载为字符串拼接操作,a + b 将被编译为:
      new StringBuilder().append(a).append(b).toString();
      
    • 随后,StringBuilder 再将拼接后的结果作为整体追加到目标 StringBuilder
  • 示例

    String a = "Hello", b = "World";
    StringBuilder sb = new StringBuilder();
    sb.append(a + b); // 等价于 sb.append("HelloWorld");
    System.out.println(sb.toString()); // 输出 "HelloWorld"
    
  • 性能

    • 隐式创建了一个临时的 StringBuilder 对象,用于拼接 ab
    • 多了一次字符串拼接和中间对象的创建,可能导致性能略低。

2. sb.append(a).append(b) 的行为

在这种写法中,append(a)append(b) 是两个独立的操作。

过程
  • 对于数字类型

    • sb.append(a) 将数字 a 转换为字符串并追加。
    • sb.append(b) 将数字 b 转换为字符串并追加。
  • 对于字符串类型

    • 直接将 ab 分别追加到 StringBuilder
  • 示例

    String a = "Hello", b = "World";
    StringBuilder sb = new StringBuilder();
    sb.append(a).append(b); // 等价于 sb.append("Hello").append("World");
    System.out.println(sb.toString()); // 输出 "HelloWorld"
    
性能
  • 没有额外的中间对象创建。
  • sb.append(a + b) 更高效,特别是在字符串拼接的场景下。

3. 两种方式的对比

特性sb.append(a + b)sb.append(a).append(b)
操作步骤a + b 先执行,然后整体追加到 StringBuilder依次将 ab 分别追加到 StringBuilder
数字类型性能高效,直接计算结果后追加高效,每个数字分别追加
字符串类型性能会创建临时 StringBuilder 对象进行拼接,稍低效没有中间对象创建,性能更高
代码可读性更简洁,特别是需要拼接多个部分时代码显得更清晰,特别是在多个 append 操作中
推荐使用场景数字运算或需要一次性拼接多个字符串字符串拼接、对性能敏感的场景

4. 示例分析

示例 1:数字拼接
int a = 10, b = 20;
StringBuilder sb1 = new StringBuilder();
sb1.append(a + b); // 先计算 a + b 的结果,等价于 sb1.append(30)
System.out.println(sb1.toString()); // 输出 "30"

StringBuilder sb2 = new StringBuilder();
sb2.append(a).append(b); // 依次追加 a 和 b,等价于 sb2.append(10).append(20)
System.out.println(sb2.toString()); // 输出 "1020"
示例 2:字符串拼接
String a = "Hello", b = "World";
StringBuilder sb1 = new StringBuilder();
sb1.append(a + b); // 创建临时对象完成 "HelloWorld",等价于 sb1.append("HelloWorld")
System.out.println(sb1.toString()); // 输出 "HelloWorld"

StringBuilder sb2 = new StringBuilder();
sb2.append(a).append(b); // 直接追加,等价于 sb2.append("Hello").append("World")
System.out.println(sb2.toString()); // 输出 "HelloWorld"

5. 哪种方式更好?

推荐场景
  • 数字拼接:如果需要对数字求和,建议使用 sb.append(a + b),更加简洁直观。
  • 字符串拼接:如果需要拼接字符串,建议使用 sb.append(a).append(b),性能更高,避免了中间对象的创建。
性能关键点
  • 如果是字符串类型,sb.append(a + b) 会创建额外的临时对象(新的 StringBuilderString),这可能影响性能。
  • 如果是数字类型,sb.append(a + b)sb.append(a).append(b) 性能差异较小。

总结

  • sb.append(a + b)

    • 更适合数字求和后追加。
    • 如果是字符串拼接,性能可能稍逊,因为会创建临时对象。
  • sb.append(a).append(b)

    • 更适合字符串拼接,避免临时对象。
    • 代码更清晰,便于扩展。

选择方法时,可以根据拼接内容的类型(数字或字符串)和对性能的要求做出合理选择。

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

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

相关文章

vue 项目使用 nginx 部署

前言 记录下使用element-admin-template 改造项目踩过的坑及打包部署过程 一、根据权限增加动态路由不生效 原因是Sidebar中路由取的 this.$router.options.routes,需要在计算路由 permission.js 增加如下代码 // generate accessible routes map based on roles const acce…

TensorFlow 2.0 环境配置

官方文档:CUDA Installation Guide for Windows 官方文档有坑,windows的安装指南直接复制了linux的指南内容:忽略这些离谱的信息即可。 可以从官方文档知悉,cuda依赖特定版本的C编译器。但是我懒得为了一个编译器就下载整个visua…

【计算机网络】【传输层】【习题】

计算机网络-传输层-习题 文章目录 10. 图 5-29 给出了 TCP 连接建立的三次握手与连接释放的四次握手过程。根据 TCP 协议的工作原理,请填写图 5-29 中 ①~⑧ 位置的序号值。答案技巧 注:本文基于《计算机网络》(第5版)吴功宜、吴英…

HarmonyOS本地存储-Preferences(用户首选项)的使用

一,用户首选项简述 ohos.data.preferences (用户首选项) 用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。 数据存储形式为键值对,键的类型为字符串型,值的存储数据…

基于Java Web 的家乡特色菜推荐系统

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇…

【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)

基于云计算、物联网、移动通信计算的智慧园区集中运营管理平台是一个高度集成化、智能化的管理系统,它利用先进的技术手段对园区进行全方位的监控和管理。 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审…

Vue2+ElementUI:用计算属性实现搜索框功能

前言: 本文代码使用vue2element UI。 输入框搜索的功能,可以在前端通过计算属性过滤实现,也可以调用后端写好的接口。本文介绍的是通过计算属性对表格数据实时过滤,后附完整代码,代码中提供的是死数据,可…

CSS实现炫酷的水波纹效果

炫酷的水波纹效果 看好了&#xff0c;下面是我最后的波纹了 实现代码 HTML&#xff1a; <div class"container"></div> <script src"https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.js"></script>CSS: body{height: 1…

【会话文本nlp】对话文本解析库pyconverse使用教程版本报错、模型下载等问题解决超参数调试

前言&#xff1a; 此篇博客用于记录调用pyconverse库解析对话文本时遇到的问题与解决思路&#xff0c;以供大家参考。 文章目录 pycoverse介绍代码github链接问题解决1 [cannot import name ‘cached_download‘ from ‘huggingface_hub‘ 问题解决](https://blog.csdn.net/wei…

单元测试时报错找不到@SpringBootConfiguration

找到问题出现原因&#xff1a; 错误表示 Spring Boot 在运行测试时无法找到 SpringBootConfiguration 注解。 通常&#xff0c;SpringBootTest注解用于加载 Spring Boot 应用上下文&#xff0c;但它需要找到一个带有SpringBootConfiguration&#xff08;或者Configuration&am…

【数据结构】11.哈夫曼树哈夫曼编码

一、哈夫曼树的基本概念 哈夫曼&#xff08;Huffman&#xff09;树又称最优树&#xff0c;是一类带权路径长度最短的树&#xff0c;在实际中有广泛的用途。 路径&#xff1a; 从树中一个节点到另一个节点之间的分支构成这两个节点之间的路径。路径长度&#xff1a; 路径上的分…

AntD表单自定义组件

前言 表单可以说是前端最常见的一种组件&#xff0c;特别是在进行搜索的时候使用的最频繁&#xff0c;自定义表单组件&#xff0c;丰富了搜索框的类型&#xff0c;使数据展现的更灵活 内容讲解 1、官方介绍 AntD-Formhttps://ant.design/components/form-cn#form-demo-cust…

day-83 最少翻转次数使二进制矩阵回文 II

思路 关键在于1的个数要为4的倍数&#xff0c;首先镜像的四个位置肯定一定为4的倍数&#xff0c;如果行和列为奇数则需要单独考虑&#xff0c;如果行和列皆为奇数&#xff0c;那么中心的那个数一定为0 解题过程 再单独考虑如果行和列为奇数&#xff0c;具体参考灵神。如果diff…

Gitcode文件历史记录查看和还原

文件历史记录 文件历史记录用于记录代码文件的更改历史&#xff0c;它允许用户查看文件的不同版本&#xff0c;了解每个版本的修改内容、作者和提交消息。这对于跟踪文件演进、恢复错误更改、审查代码以及了解项目进展都非常有用。 文件历史记录功能提供了以下核心功能&#…

WebSocket协议在Java中的整合

1. 常见的消息推送方式 2.WebSocket API 3.基于WebSocket的实战&#xff08;实时聊天室&#xff09; 这里以解析后端代码为主&#xff0c;前端不作为重点&#xff0c;若想复现项目&#xff0c;请从作者的仓库中拉取代码 WebSocket-chatRoom: 基于WebSocket协议实现一个简单的…

http自动发送请求工具(自动化测试http请求)

点击下载《http自动发送请求工具(自动化测试http请求)》 前言 在现代软件开发过程中&#xff0c;HTTP 请求的自动化测试是确保应用程序稳定性和可靠性的关键环节。为了满足这一需求&#xff0c;我开发了一款功能强大且易于使用的自动化 HTTP 请求发送工具。该工具基于 C# 开发…

【小白可懂】微信小程序---课表渲染

结果展示&#xff1a;&#xff08;代码在最后&#xff09; WeChat_20241116174431 项目简介 在数字化校园建设的大背景下&#xff0c;为了更好地服务于在校师生&#xff0c;我们开发了一款基于微信小程序的课表管理系统。该系统采用了现代化的前端技术和优雅的设计风格&#x…

WinDefender Weaker

PPL Windows Vista / Server 2008引入 了受保护进程的概念&#xff0c;其目的不是保护您的数据或凭据。其最初目标是保护媒体内容并符合DRM &#xff08;数字版权管理&#xff09;要求。Microsoft开发了此机制&#xff0c;以便您的媒体播放器可以读取例如蓝光&#xff0c;同时…

LabVIEW前面板最大化显示与像素偏差分析 有源程序附件

LabVIEW前面板最大化显示与像素偏差分析 有源程序附件 LabVIEW前面板最大化显示与像素偏差分析 有源程序附件 - 北京瀚文网星科技有限公司 这个VI用于将LabVIEW程序的前面板最大化地显示在指定显示器上&#xff0c;实现步骤如下&#xff1a; 1. 获取所有显示器的信息 首先&…

【C++】深入理解 C++ 优先级队列、容器适配器与 deque:实现与应用解析

个人主页: 起名字真南的CSDN博客 个人专栏: 【数据结构初阶】 &#x1f4d8; 基础数据结构【C语言】 &#x1f4bb; C语言编程技巧【C】 &#x1f680; 进阶C【OJ题解】 &#x1f4dd; 题解精讲 目录 前言&#x1f4cc; 1. 优先级队列、容器适配器和 deque 概述✨1.1 什么是优…