【Java】如何在 Java 中连接字符串

news2024/9/25 13:25:30

本文仅供学习参考!

Java 编程教程

字符串连接可以定义为将两个或多个字符串连接在一起以形成新字符串的过程。大多数编程语言至少提供一种连接字符串的方法。Java 为您提供了多种选择,包括:

  • **+**运算符
  • **String.concat()**方法
  • StringBuilder
  • StringBuffer

本文将介绍如何使用上述四种方法中的每一种将字符串连接在一起,并提供一些关于如何在给定情况下选择最佳方法的提示。

使用加号 (+) 运算符

这是 Java 中连接字符串最简单且最常用的方法。将加号 ( + ) 运算符放在两个或多个字符串之间会将它们组合成一个全新的字符串。因此,通过串联生成的String对象将存储在 Java 堆中的新内存位置中。但是,如果字符串池中已存在匹配的字符串,则返回对找到的String对象的引用。您可以将其视为一种缓存形式。下面是 Java 中**+**运算符的快速代码示例:

String firstName = "Rob";
String lastName  = "Gravelle";
// Outputs "Rob Gravelle"
System.out.println(firstName + " " + lastName);

加号 (+) 运算符的优点:自动类型转换和 Null 处理

+运算符自动将所有本机类型转换为其字符串表示形式,因此它可以处理从intsfloatdouble到单 ( char ) 字符的所有内容。此外,它不会抛出任何Null值异常,并将Null转换为其String表示形式。下面是一些示例代码,展示了如何在 Java 中使用**+**运算符进行字符串连接:

String fruits = "apples";
int howMany = 4;
String other = null;
// Outputs "I have 4 apples as well as null."
System.out.println("I have " + howMany + " " + fruits + " as well as " + other + ".");

在幕后,+运算符使用本机类型的隐式类型转换和对象的toString()方法将非字符串数据类型静默转换为String ,这就是它避免NullPointerException的方法。唯一的缺点是我们最终会在结果字符串中得到单词“ null ”,这可能不是开发人员想要的。

字符串连接是通过StringBuilder类的**append()方法实现的。+运算符通过将第二个操作数附加到第一个操作数的末尾来生成一个新字符串。**在我们前面的示例中,Java 正在执行以下操作:

String s = (new StringBuilder())
             .append("I have ")
             .append(howMany)
             .append(" ")
             .append(fruits)
             .append(" as well as ")
             .append(other)
             .append(".")
               .toString(); 

Java 字符串连接技巧

如果您打算再次使用它,请始终将使用**+运算符连接后返回的字符串存储在变量中。这将避免程序员必须多次经历串联过程。另外,避免使用+**运算符在循环中连接字符串,因为这会导致大量开销。

虽然很方便,但**+**运算符是连接字符串最慢的方法。其他三个选项效率更高,我们接下来会看到。

使用 String.concat() 方法

String.concat方法将指定字符串连接到当前字符串的末尾。其语法为:

@Test
void concatTest() {
String str1 = "Hello";
String str2 = " World";
assertEquals("Hello World", str1.concat(str2));
assertNotEquals("Hello World", str1); // still contains "Hello"
}

我们可以通过链接连续的concat调用来连接多个 String ,如下所示:

void concatMultiple() {
String str1 = "Hello";
String str2 = " World";
String str3 = " from Java";
str1 = str1.concat(" ").concat(str2).concat(str3);
System.out.println(str1); //"Hello World from Java";
}

请注意,当前字符串和要追加的字符串都不能包含Null 值。否则,concat 方法将抛出NullPointerException

StringBuilder 和 StringBuffer 类

StringBuilderStringBuffer类是 Java 中连接字符串的最快方法。因此,它们是连接大量字符串的理想选择——尤其是在循环中。这两个类的行为方式大致相同,主要区别在于 StringBuffer是线程安全的,而StringBuilder不是。这两个类都提供了一个**append()**方法来执行串联操作。 append()方法被重载以接受许多不同类型的参数,例如ObjectsStringBuilderintcharCharSequencebooleanfloatdouble等。

除了性能优势之外,StringBufferStringBuilder还提供了不可变String类的可变替代方案。与包含固定长度、不可变的字符序列的String类不同, StringBufferStringBuilder具有可扩展的长度和可修改的字符序列。

下面是一个使用StringBuilderStringBuffer连接十个整数的数组的示例:

import java.util.stream.IntStream;
import java.util.Arrays;

public class StringBufferAndStringBuilderExample {
  public static void main(String[] args) {
    // Create an array from 1 to 10
    int[] range = IntStream.rangeClosed(1, 10).toArray();
    
    // using StringBuilder
    StringBuilder sb = new StringBuilder();
    for (int num : range) {
      sb.append(String.valueOf(num));
    }
    System.out.println(sb.toString()); // 12345678910
    
    // using StringBuffer
    StringBuffer sbuf = new StringBuffer();
    for (int num : range) {
      sbuf.append(String.valueOf(num));
    }
    System.out.println(sbuf.toString()); // 12345678910
  }
}

END

本文中,我们全面了解了 Java 将字符串连接在一起的四种主要方法,以及有关如何在给定情况下选择最佳方法的提示。总而言之,当您需要在**+运算符、concat方法和StringBuilder/StringBuffer类之间进行选择时,请考虑您是单独处理字符串还是混合数据类型。您还应该考虑Null值上NullPointerExeptions的可能性。最后,还有性能和可变性的问题。+运算符是今天看到的所有选项中最慢的,而StringBuilderStringBuffer**类既快速可变。

如果您确实想查看 Java 中的所有串联选项,版本 8 引入了更多连接String的方法,包括String.join()方法和StringJoiner类。版本 8 还引入了CollectorsCollectors类具有join()方法,其工作方式与String类的**join()**方法非常相似。

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

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

相关文章

LeetCode·每日一题·1186. 删除一次得到子数组最大和·动态规划

作者:小迅 链接:https://leetcode.cn/problems/maximum-subarray-sum-with-one-deletion/solutions/2321919/dong-tai-gui-hua-zhu-shi-chao-ji-xiang-x-cwvs/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作…

XILINX 7系列FPGA Dedicated Configuration Bank功能详解

🏡《Xilinx FPGA开发指南》 目录 1,概述2,功能详解2.1,DXP_0与DXN_02.2,VCCBATT_02.3,INIT_B_02.4,M0_0,M1_0,M2_02.5,TDI,TDO,TMS,TCK2.6, VCCAD…

【Unity开发小技巧】UnityWebGL打包本地浏览器运行查看

目录 一.前言: 二.WebGL打包 三.配置web.config(重要) 四.部署IIS 五.测试 一.前言: 正常打包WebGL后在浏览器直接运行会报以下这个错: It seems your browser does not support running Unity WebGL content fr…

【效率工具】Windows 10 终端自动补全、智能提示

1. 安装PSReadLine 2.1.0 Install-Module PSReadLine -RequiredVersion 2.1.02. 检查是否存在配置文件 Test-path $profile创建配置文件(不存在的话) New-item –type file –force $profile3. 编辑配置文件 notepad $profile4. 运行该指令后退出终端…

rancher-import-k8s集群

一、 二、 三、 四、 到k8s 节点服务器上执行: 其实在:https://192.168.31.105:8443/v3/import/fgmt2r88wn4xvkm9n88gnshhhb8l976n6rpdvgz79r6rsfhlljnsxn_c-m-kq6c2fvn.yaml 里面下载了镜像 我们可以先下载镜像: docker pull rancher/ranc…

CSDN-AI小组2023-半年-研发总结

目录 1.丐版「大模型」,Proof of concept2. LLM和AIGC的各种综述3. 基于Embedding的应用,问答,AI编程4. 评论区的AI助手5. 结合AIGC的各种数据自动计算6. 个性化推荐的系统重构7. 基于AIGC的个性化博客创作鼓励8. 博客质量分V5: 可解释性计算…

java基础之super

当父类拥有一个带参的构造方法时,子类要有一个带有相同类型参数的构造方法,并且第一行使用super(参数)来接受,否则会报错 上图是一个类 Two,拥有一个带String类型参数的构造方法。 上图是一个类One&#x…

Java数字图像处理教程

地址 Java DIP - GrayScale转换为了将彩色图像转换为灰度图像,您需要使用File和ImageIO对象读取图像的像素或数据,并将图像存储在BufferedImage对象中。其语法如下: File input new File("digital_image_processing.jpg"); Buffe…

PHP --- 登录界面构建与mysql交互

登录界面构建与mysql交互 环境准备 win2003server phpstudy2016 vscode &#xff08;1&#xff09;login.html 利用input表单就可构建简单登录界面<fieldset>标签&#xff1a;框住标签内容<legend>标签&#xff1a;为filedset标签添加标题<label>标签&am…

UE5.1.1 C++从0开始(15.作业4个人作业分享)

教程链接&#xff1a;https://www.bilibili.com/video/BV1nU4y1X7iQ 好吧这个作业应该是之前写的&#xff0c;但是我发现我没写&#xff0c;后面我又回去自己写了一遍再看代码&#xff0c;感觉上大差不差&#xff0c;各位可以看着我的和老师的还有自己的对比下。 SBTService_…

display:flex的用法

flex: 元素以弹性布局方式显示&#xff0c;可以通过设置父元素的 display: flex 属性来实现子元素的弹性布局。常用于实现响应式布局和灵活的元素排列。 当使用 display: flex; 将元素容器设置为弹性布局时&#xff0c;子元素会自动填充容器&#xff0c;并根据容器的宽度进行调…

python实现磨皮效果

主要是借鉴了这个文章&#xff0c;写的非常棒&#xff0c;会比直接使用保边滤波好很多&#xff0c;能够高保真&#xff0c;不会糊掉。 我使用python简单的实现了一下&#xff0c;看起来还不错 import time import numpy as np import cv2def mopi(src):high_pass src.copy()…

【Docker】Docker运行时间长,空间不足no space left on device: unknown

空间不足no space left on device: unknown问题解决 1.执行出错2.解决方法3.dump文件是否可以删除 1.执行出错 在运行 docker restart 容器Id查看磁盘空间占用 df -h2.解决方法 这个问题是由与 /run 的空间使用完了&#xff0c;清理/run的空间,经过查找使用最大的是 /run/u…

Linux 情景分析

系列文章目录 Linux 内核设计与实现 深入理解 Linux 内核 Linux 设备驱动程序 Linux设备驱动开发详解 深入理解Linux虚拟内存管理 Linux 情景分析 文章目录 系列文章目录一、存储管理1、外部设备存储空间的地址映射&#xff08;1&#xff09;ioremap&#xff08;2&#xff09;g…

力扣 513. 找树左下角的值

题目来源&#xff1a;https://leetcode.cn/problems/find-bottom-left-tree-value/description/ C题解1&#xff1a;是寻找最底层最左边的节点&#xff0c;不是最底层的左子树节点&#xff01; &#xff01; 使用层序遍历&#xff0c;判断左右子树是不是叶子节点&#xff0c;进…

snmp_exporter监控交换机网络流量

一.背景与需求 最近收到机房账单多出了将近70M下行带宽&#xff0c;多交了8K多的费用&#xff0c;很是蛋疼。IDC机房使用每月保底带宽模式, 例如保底100M带宽/月&#xff0c;如果利用955计费方式&#xff0c;没超出100M则只收机柜和保底带宽的费用&#xff0c;如果超出1M则按照…

资本和技术的两个死结

技术与资本的两个死结 资本从一开始就俘获了技术 没有资本主义 就没有科学和技术 以前肯定是科技的崇拜者 现在多了一个视角 趣讲大白话&#xff1a;自己给自己挖坟 【趣讲信息科技210期】 **************************** 搞科学的看不起搞技术的 科学和技术确实是两码事 但最后…

LabVIEW里计算当前时间起前几个月的时间段

在查询数据时&#xff0c;可能会用到从某个时间开始&#xff0c;前几个月的数据&#xff0c;这时就需要计算出查询的历史时间&#xff0c;该如何计算呢&#xff1f;如图&#xff1a; 注意点&#xff1a; 1、日应该是当前日期的后一天。 2、当前的月数与历史的月数相等时的处置…

使用shiro框架进行认证拦截

01.需要添加依赖 在springboot项目中&#xff0c;使用shiro框架需要在pom.xml文件中去添加依赖&#xff1a; org.apache.shiro shiro-spring 1.4.1 02.shiro核心对象配置 这里需要配置一个配置类&#xff0c;使用的注解是Configuration&#xff0c;这表示修饰的类会有多个注…

Nacos集群版本升级2.2.3

官方传送 官方文档传送门 记录日期 2023-06-28 背景简介 当前Nacos版本为2.1.0&#xff0c;集群部署与官方文档一致&#xff0c;通过阿里云负载均衡SLB服务挂载3台ECS提供服务&#xff0c;如图&#xff1a; 近期有漏洞Nacos 内网集群Raft 反序列化漏洞披露。 影响版本 …