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

目录

引言

一、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.rhkb.cn/news/432956.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【图像处理】多幅不同焦距的同一个物体的平面图象,合成一幅具有立体效果的单幅图像原理(二)

实现多幅不同焦距图像合成一幅具有立体效果的图像可以使用以下算法和开源库: 实现算法 图像对齐 使用特征点匹配(如 SIFT、SURF 或 ORB)来对齐图像。利用 RANSAC 算法剔除离群点,估计变换矩阵。 深度图生成 基于图像的焦距和视角…

信息安全工程师(19)HASH函数与数字签名

一、Hash函数 1、定义 Hash函数,又称散列函数或哈希函数,是一种将任意长度的输入(称为预映射或消息)通过散列算法变换成固定长度输出(称为散列值或哈希值)的函数。这种转换是单向的,即不能从哈…

使用python爬取豆瓣网站?如何简单的爬取豆瓣网站?

1.对python爬虫的看法 首先说说我对python的看法,我的专业是大数据,我从事的工作是java开发,但是在工作之余,我对python又很感兴趣,因为我觉得python是一门很好的语言,第一:它可以用来爬取数据…

ROS与无人驾驶学习笔记(一)——ROS基本操作

文章目录 ※ 安装ubuntu 下载 创建虚拟机 安装系统 安装vmware tool 更新源 安装常用软件 ※ 安装ROS 设置软件更新 使用清华源安装 ros测试 认识ROS ROS特点 ROS系统实现 ROS安装 工作需要,转行做码农了。。。 大概是无人驾驶相关的,啥都不会。。。 看成…

arthas简单应用

背景说明 项目上某个接口响应时间过长,需要查看方法耗时情况进行优化 安装配置 访问下载页进行下载:下载 | arthas 调整文件位置进行解压缩 - 查看arthas帮助命令(非必须,官网文档更详细) C:\tools\arthas\4.0.1\b…

IvorySQL 3.4 来了

9 月 26 日,IvorySQL 3.4 发版。本文将带大家快速了解新版本特性。 IvorySQL 3.4 发版说明 IvorySQL 3.4 基于 PostgreSQL 16.4,修复了多个问题,并增强多项功能。 PostgreSQL 16.4 的变更 在未经授权时防止 pg_dump 执行,并引入一…

MMD模型一键完美导入UE5-VRM4U插件方案(一)

1、下载pmx模型 1、去模之屋官网下载MMD模型,模之屋 2、下载完成得到pmx和Texture文件 2、下载并启用VRM4U插件 1、下载VRM4U插件, VRM4U,点击Latest下载对应引擎版本 2、将插件放到Plugins目录,然后

Git GUI操作流程

1,点击运行 Gt GUI 2,界面如下 3,点击Creat new Repository或者在菜单栏点击Repository--new 4,点击Browse选择目录,点击create,创建本地git仓库 5,对应盘里生成一个.git文件,用于版本管理 6&am…

随记——机器学习

前言 本来有个500块钱的单子,用机器学习做一个不知道什么鸟的识别,正好有数据集,跑个小项目,过一下机器学习图像识别的流程,用很短的时间记录下来..... 一、数据预处理 将数据集分为训练集和测试集,直接…

基于SpringBoot校园失物招领系统设计与实现

文未可获取一份本项目的java源码和数据库参考。 本课题的作用、意义,在国内外的研究现状和发展趋势,尚待研究的问题 作用:本课题的目的是使失物招领信息管理清晰化,透明化,便于操作,易于管理。通过功能模…

vue3 选择字体的颜色,使用vue3-colorpicker来选择颜色

1、有的时候我们会用到颜色的选择器,像element-plus提供了,但是ant-design-vue并没有: 这个暂时没有看到: 但是Ant Design 5的版本有,应该不是vue的。 2、使用第三方提供的vue3-colorpicker:storybook/cli…

【Gitee自动化测试3】Git的本地使用,和在Gitee上使用

一. 创建版本库 存放项目,项目的删除更改,版本库都能够监控。 创建一个文件夹(不要包含中文路径),右键选择Git Bash Here(打开Git终端) 输入git init 对文件夹进行版本库的初始化,…

【CSS】背景

background-color 颜色background-image 图像background-size 缩放background-repeat 平铺background-position 定位background-clip 裁剪区域background-origin 开始区域background-attachment 滚动方式 background-color 颜色 <style>div{width: 200px;height: 100px;…

LeetCode - 850 矩形面积 II

题目来源 850. 矩形面积 II - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个轴对齐的二维数组 rectangles 。 对于 rectangle[i] [x1, y1, x2, y2]&#xff0c;其中&#xff08;x1&#xff0c;y1&#xff09;是矩形 i 左下角的坐标&#xff0c; (xi1, yi1) 是该…

【机器学习】探索LSTM:深度学习领域的强大时间序列处理能力

目录 &#x1f354; LSTM介绍 &#x1f354; LSTM的内部结构图 2.1 LSTM结构分析 2.2 Bi-LSTM介绍 2.3 使用Pytorch构建LSTM模型 2.4 LSTM优缺点 &#x1f354; 小结 学习目标 &#x1f340; 了解LSTM内部结构及计算公式. &#x1f340; 掌握Pytorch中LSTM工具的使用. &…

【react案例】实现评论列表

1. 需求 展示评论列表实现删除功能 2.1 只有自己的评论才展示删除按钮 2.2 点击删除按钮&#xff0c;删除当前评论tab切换&#xff08;点击对应tab&#xff0c;对tab文案高亮处理&#xff09;评论高亮评论排序&#xff08;最新、最热&#xff09; 2. 实现思路 useState维护评…

【小程序】uniapp自定义图标组件可动态更换svg颜色

组件描述 通过图标名称加载对应svg&#xff0c;size参数调整图标大小&#xff0c;color参数调整图标颜色 解决思路&#xff1a; 存svg获svg&#xff0c;对象方式正则替换svg的fill值&#xff0c;不改变源文件&#xff0c;通过base64直接加载缓存svg源文件&#xff0c;避免重…

Android 通过自定义注解实现Activity间跳转时登录路由的自动拦截

应用场景 在Android 中部分软件需要登录才能使用&#xff0c;但是有的页面又不需要登录&#xff0c;Android不同于Web可以直接拦截重定向路由&#xff0c;因此如果在Android中如果需要检测是否登录&#xff0c;如果没登录跳转登录的话就需要再每个页面中判断&#xff0c;当然也…

Leetcode面试经典150题-39.组合总和

给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target &#xff0c;找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 &#xff0c;并以列表形式返回。你可以按 任意顺序 返回这些组合。 candidates 中的 同一个 数字可以 无限制重复被选取 。如…

高级算法设计与分析 学习笔记9 跳表

单链表的样子我们很熟悉了&#xff1a; 怎么加快查找&#xff1f;&#xff1a; 查找的具体方法&#xff1a; 超过了就回头下去。 这条“快速路”最好是几个节点呢&#xff1f;&#xff1a; 假如我们弄好多层跳表呢&#xff1f;&#xff1a; 给弄成2叉树了&#xff01; 如何插入…