【Java】Java中String、StringBuilder、StringJoiner详解

news2024/11/16 2:15:21

目录

引言

一、String

1.1 String的定义

1.1.1 直接赋值

1.1.2 new关键字创建 

1.2 常用方法

1.3 字符串的不可变性

1.4 字符串内存的存储原理

二、StringBuilder

2.1 常用方法

2.2 动态扩容策略

2.3 使用场景

三、StringJoiner

3.1 构造方法

3.2 常用方法

3.3 示例

总结


引言

在Java中,字符串处理是一项常见的任务,而String、StringBuilder和StringJoiner是处理字符串时常用的三个类。它们各自有不同的特点和用途,下面将详细解析这三个类,并附带代码示例。


一、String

String是Java中的一个类,代表不可变的字符序列。它是Java中最常用的类之一,用于表示文本信息。由于String的不可变性,一旦创建,其内容就不能被改变。任何对字符串的修改操作都会生成一个新的字符串对象。


1.1 String的定义


1.1.1 直接赋值

直接赋值:通过双引号直接赋值给String变量,这种方式创建的字符串会被存储在字符串常量池中,以节省内存。

String s1 = "hello";  
String s2 = "hello"; // s2会复用s1在字符串常量池中的对象

1.1.2 new关键字创建 

通过new关键字:使用new关键字创建String对象,这种方式创建的字符串对象不会被存储在字符串常量池中。 

String s3 = new String("hello");

1.2 常用方法

  • charAt(int index):返回指定索引处的字符。

String str = "hello";  
char c = str.charAt(1); // c = 'e'
  • indexOf(String str):返回指定子字符串在此字符串中第一次出现处的索引。

int index = str.indexOf("e"); // index = 1
  • substring(int beginIndex, int endIndex):返回字符串的一个子字符串,从beginIndex(包含)到endIndex(不包含)。

String sub = str.substring(1, 4); // sub = "ell"
  • equals(Object anObject):比较两个字符串的内容是否相等。

boolean isEqual = s1.equals(s3); // true
  • toLowerCase() 和 toUpperCase():将字符串转换为小写或大写。

String lower = str.toLowerCase(); // lower = "hello"  
String upper = str.toUpperCase(); // upper = "HELLO"

1.3 字符串的不可变性

由于String的不可变性,任何对字符串的修改操作(如拼接、替换等)都会生成一个新的字符串对象。这可能会导致大量的内存分配和垃圾回收,特别是在处理大量字符串操作时。


1.4 字符串内存的存储原理

①直接赋值其字符串存在字符串常量池中,创建时会先在字符串常量池寻找有无相同的字符串,有则复用,无则创建;

②new关键字创建字符串,不会复用,而是都开辟出一个新空间。

注:键盘录入得到的字符串最终是new出来的。


二、StringBuilder

StringBuilder是Java 5中引入的一个类,用于创建和操作可变字符串。与String不同,StringBuilder允许在不生成新对象的情况下修改字符串的内容,从而提高了处理字符串时的效率和性能。


2.1 常用方法

append(String str):将指定的字符串追加到此字符序列。

StringBuilder sb = new StringBuilder("Hello");  
sb.append(" World"); // sb = "Hello World"

insert(int offset, String str):将指定的字符串插入此字符序列中的指定位置。

sb.insert(6, "Java "); // sb = "Hello Java World"

delete(int start, int end):移除此序列的子字符串中的字符。

sb.delete(5, 11); // sb = "Hello World"

reverse():将此字符序列用其反转形式取代。

sb.reverse(); // sb = "dlroW olleH"

toString():返回此序列中数据的字符串表示形式。

String result = sb.toString(); // result = "Hello World"

2.2 动态扩容策略

StringBuilder通过内部的字符数组来存储字符串数据。当现有容量不足以容纳更多的字符时,它会自动扩容。这种动态扩容的策略可以减少内存的重新分配次数和复制次数,从而提高性能。

拓展底层原理:

①默认创建一个长度为16的字节数组。

②添加的内容小于16,直接存。

③添加的内容大于16会扩容(原容量*2+2)。

④如果默认扩容还不够,则以实际长度为准。


2.3 使用场景

①字符串拼接。

②字符串反转。


三、StringJoiner

StringJoiner是Java 8新增的一个类,基于StringBuilder实现,用于实现对字符串之间通过分隔符拼接的场景。它简化了字符串拼接的复杂性,特别是在需要添加前缀、后缀和分隔符时。


3.1 构造方法

StringJoiner(CharSequence delimiter):创建一个不带前缀和后缀的StringJoiner,使用指定的分隔符。

StringJoiner sj = new StringJoiner(",");

StringJoiner(CharSequence delimiter, CharSequence prefix, CharSequence suffix):创建一个带有指定前缀、后缀和分隔符的StringJoiner。

StringJoiner sj = new StringJoiner(",", "[", "]");

3.2 常用方法

add(CharSequence newElement):添加新的元素到StringJoiner中。

注:目前添加的内容只能是字符串

sj.add("hello");  
sj.add("world");

toString():返回拼接后的字符串。

String result = sj.toString(); // result = "[hello,world]"

3.3 示例

StringJoiner sj = new StringJoiner(",", "[", "]");  
sj.add("hello");  
sj.add("world");  
System.out.println(sj.toString()); // 输出: [hello,world]

总结

  • String:不可变的字符序列,适用于不需要修改字符串内容的场景。
  • StringBuilder:可变的字符序列,适用于需要频繁修改字符串内容的场景,如拼接、删除等操作。
  • StringJoiner:基于StringBuilder实现,简化了字符串拼接的复杂性,特别适用于需要添加前缀、后缀和分隔符的场景。

 

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

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

相关文章

ArcGIS共享数据的最佳方法(不丢可视化、标注等各类显示信息一样带)

今天我们介绍一下ArcGIS数据共享的几个小妙招 我们时常要把数据发给对方,特别是很多新手朋友要将shp发给对方时只是发送了shp后缀的文件,却把shp的必要组成文件dbf、shx等等给落下了。 还有很多朋友给图层做好了符号化标注,但是数据一发给别…

介绍几个LDO低压差线性稳压器(ME6206、RT9013、XC6206)

最近翻了翻开源平台上面的一些设计,收集了一些LDO的电路设计,这边分享记录一下。 ME6206 不同的产品型号对应不同的输出电压,工作电流,封装形式。 典型应用电路图也很简单,就在电压的输入输出端各加一个电容。 输入电…

Miniforge详细安装教程(macOs和Windows)

(注:主要是解决商业应用anaconda收费问题,这是轻量级的代替,个人完全可以使用anaconda和miniconda) Miniforge 是一个轻量级的包管理器,类似于 Anaconda 和 Miniconda。它主要用于安装基于 conda 的 Python 环境,专注于…

【智能算法应用】樽海鞘群算法求解二维路径规划问题

摘要 路径规划是机器人导航和自主无人机领域中的关键问题。本文提出了一种基于智能优化算法——樽海鞘群算法(Salp Swarm Algorithm, SSA)的二维路径规划方法。该算法模拟樽海鞘的链式运动行为,旨在寻找障碍物环境中的最优路径。通过仿真实验…

StopWath,apache commons lang3 包下的一个任务执行时间监视器的使用

StopWath是 apache commons lang3 包下的一个任务执行时间监视器&#xff0c;与我们平时常用的秒表的行为比较类似&#xff0c;我们先看一下其中的一些重要方法&#xff1a; <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --> <dependen…

3D 模型GLTF、GLB格式文件介绍使用;FBX格式

一、GLTF、GLB介绍 GLTF&#xff08;GL Transmission Format&#xff09;和 GLB&#xff08;GL Binary&#xff09;是用于在 Web 和各种应用程序中传输和加载 3D 场景和模型的开放标准格式。它们由 Khronos Group 开发&#xff0c;旨在提供一种高效、可扩展且易于使用的 3D 内…

RUST语言的初印象-从一个模拟登陆谈起-slint+reqwest+aes

本文就一个做了三四天的小程序讲第一次学用RUST的感受&#xff0c;内附代码。 了角语言 从一些渠道听说了R&#xff0c;这个字母挺魔性&#xff0c;那个文章说C和R的团体已经上升到了宗教崇拜的高度&#xff0c;然后&#xff0c;我觉得必 有过人之处&#xff0c;大约10年没碰…

C# DotNetty客户端

1. 引入DotNetty包 我用的开发工具是VS2022&#xff0c;不同工具引入可能会有差异 工具——>NuGet包管理器——>管理解决方案的NuGet程序包 搜索DotNetty 2.新建EchoClientHandler.cs类 用于接收服务器返回数据 public class EchoClientHandler : SimpleChannelIn…

vs code自动报错

让vs code自动报错&#xff0c; 点击插件 → 搜索error lens → 点击install&#xff0c; 下载完后&#xff0c;编写的代码有问题就会自动报错了。 5、修改默认缩进字符 点击设置&#xff08;settings&#xff09; → 点击常用设置 → 修改字符缩进。

汽车自研算法部署芯片份额浅思

国内汽车行业如火如荼发展,汽车从业的研发人员也激增,从三电到座舱到智能驾驶和动力底盘一体化发展。 芯片承载着算法落地,国内主流的主机厂(OEM)的EE架构规划都基本使用主流的车规级芯片,如 英飞凌(Infineon):德国半导体制造商,行业当前在预控的SOC的MCU选择TC39X…

ROC、TPR、FPR的含义

1、ROC&#xff08;Receiver Operating Characteristic&#xff09; ROC&#xff08;Receiver Operating Characteristic&#xff09;曲线是一种用于评估分类模型性能的工具。它通过绘制真阳性率&#xff08;True Positive Rate, TPR&#xff09;与假阳性率&#xff08;False…

新书速览|Stable Diffusion-ComfyUI AI绘画工作流解析

《Stable Diffusion-ComfyUI AI绘画工作流解析》 本书内容 《Stable Diffusion-ComfyUI AI绘画工作流解析》从零开始&#xff0c;详尽系统地讲解从本地部署ComfyUI、下载安装自定义节点&#xff0c;到搭建各种工作流程的全过程。同时&#xff0c;辅以3D形象转绘、艺术二维码和证…

智能制造的生产力基础设施

由于全球大多数细分市场的半导体工厂都满负荷运转&#xff0c;因此&#xff0c;生产力如今成为整个行业关注的重要问题也就不足为奇了。工厂经理会仔细监控关键绩效指标 (KPI)&#xff0c;以发现任何生产力下降的迹象&#xff0c;以便快速做出反应&#xff0c;找出并解决这些偏…

UE4中 -skipbuild -nocompile 有什么区别

在项目开发中&#xff0c;我看到了在调用 Engine\\Build\\BatchFiles\\RunUAT.bat 相关的命令行中&#xff0c;有 -skipbuild、 -nocompile 两个很像的参数&#xff0c;于是想探究一下它们的区别与含义。 -skipbuild 参数 到底有没有 -skipbuild 这个参数&#xff1f;根据 http…

1.3 熟悉常用的IP相关命令

1.3熟悉常用的IP相关命令 原理概述 华为设备支持多种配置方式&#xff0c;包括Web界面管理等。但作为一名网络工程师&#xff0c;必须熟悉使用命令行的方式进行设备管理。在工作中&#xff0c;对路由器和交换机最常用的操作命令就是IP相关命令&#xff0c;如配置主机名、IP地…

<Rust>egui学习之部件(十三):如何为文本添加链接Link和超链接HyperLink功能?

前言 本专栏是关于Rust的GUI库egui的部件讲解及应用实例分析&#xff0c;主要讲解egui的源代码、部件属性、如何应用。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;rust 库&#xff1a;egui、eframe 概述 本文是本专栏的第十三篇…

ROS与无人驾驶学习笔记(零)——问题汇总

文章目录 ubuntu相关问题 ubuntu中中文输入法没有输入框 在ubuntu中使用双拼输入 ros卸载重装报错的问题 在学习ubuntu、ros以及无人驾驶过程中遇到的问题我都记在在这里 ubuntu相关问题 ❤ 2024.9.20 ❤ ubuntu中中文输入法没有输入框 因为我用的是arm平台&#xff0c;于…

软件对比 | 历史气象数据哪里找?

中国气象网和羲和能源气象大数据平台两个平台当然没有“绝对”哪个好的说法&#xff0c;各自特点都在下图进行总结&#xff0c;到底用哪个还是根据自己需求自己抉择。 希望可以帮助到大家~

Maven中 <parent > 的<version>可以使用变量吗

答案&#xff1a; 不可以&#xff01; 在 Maven 中&#xff0c;父 POM 的 <version> 元素不能直接使用变量。父 POM 的版本号必须是硬编码的&#xff0c;不能通过变量来动态设置。这是因为父 POM 的版本号在子模块中引用时&#xff0c;需要是一个固定的值&#xff0c;以…

记录:ubuntu20.04的安装和必要的开发准备

记录ubuntu20.04的安装和必要的开发准备 准备1. 安装ubuntu20.04时的Tips2. 屏幕亮度调节问题3. 解决 "No Wi-Fi Adapter Found"4. Nvidia Driver && cuda5. 修改安装源6. ssh 远程开发7. 安装 anaconda 准备 没有装双系统&#xff0c;只有 ubuntu20.04&…