当前位置: 首页 > article >正文

【七. Java字符串操作与StringBuilder高效拼接技巧】

7. java字符串

7.1 API

  • 介绍:应用程序编程接口。在 Java 中,API 指的是 JDK 提供的各种功能类,这些类把底层实现封装好了,我们不用关心内部怎么写的,直接用就行

  • 用 API 帮助文档步骤:以查Random类为例

    • 打开帮助文档,找到索引输入框

    • 输入 “Random”,按回车

    • 看类在哪个包(java.util包,用的时候要导包)

    • 看类的描述(知道它是生成随机数的)

    • 看构造方法(比如new Random()创建对象)

    • 看成员方法(比如nextInt()生成整数随机数)

  • 例子:

      import java.util.Random;public class APIDemo {public static void main(String[] args) {Random r = new Random(); // 创建Random对象int num = r.nextInt(10); // 生成0-9的随机数System.out.println("随机数:" + num);}}

7.2 String

  • 介绍:String 类代表字符串,Java 里所有双引号括起来的都是 String 对象

  • String 类的特点:

    • 字符串不可变:创建后内容不能改比如String s = "a"; s = "b";,其实是重新创建了 “b” 对象,“a” 还在内存里,只是 s 不再指向它

    • 字符串可共享:如果内容相同,只会存一份比如String s1 = "abc"; String s2 = "abc";,s1 和 s2 指向同一个 “abc” 对象

    • 底层是字节数组:表面像字符数组char[],实际存的是byte[],存的是字符的 ASCII 码值

  • String 类的构造方法

    方法名说明
    public String()创建空字符串,如new String()结果是 “”
    public String(char[] chs)用字符数组创建字符串,如char[] ch = {‘a’,‘b’}; new String(ch)结果是 “ab”
    public String(byte[] bys)用字节数组创建字符串,如byte[] b = {97,98}; new String(b)结果是 “ab”(97 是 ‘a’ 的 ASCII 码)
    String s = “abc”;直接赋值创建,最常用,如String s = “hello”;
  • 例子:

      public class StringDemo {public static void main(String[] args) {// 空字符串String s1 = new String();System.out.println("s1长度:" + s1.length()); // 0// 字符数组创建char[] ch = {'h', 'e', 'l'};String s2 = new String(ch);System.out.println("s2:" + s2); // hel// 字节数组创建byte[] b = {100, 101}; // 'd'和'e'的ASCII码String s3 = new String(b);System.out.println("s3:" + s3); // de// 直接赋值String s4 = "world";System.out.println("s4:" + s4); // world}}
  • 创建字符串对象两种方式的区别:

    • 构造方法(new):每次new都会在堆里新建对象,地址不同比如String s1 = new String("a"); String s2 = new String("a");,s1 和 s2 地址不同。

    • 直接赋值(“”):内容相同的字符串只存一份在字符串常量池,地址相同比如String s1 = "a"; String s2 = "a";,s1 和 s2 指向同一个 “a”

  • 字符串的比较:

    • == 号:

      • 基本数据类型:比数值,如int a=1; int b=1; a==btrue

      • 引用数据类型(如 String):比地址值,如new String("a") == new String("a")false,因为地址不同

    • equals 方法:专门比字符串内容,忽略地址,区分大小写。如"a".equals("A")false"a".equals("a")true

  • 例子:

      public class StringCompareDemo {public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("abc");String s3 = "abc";String s4 = "abc";// ==比较地址System.out.println(s1 == s2); // false(new出来的地址不同)System.out.println(s1 == s3); // false(一个在堆,一个在常量池)System.out.println(s3 == s4); // true(都在常量池,地址相同)// equals比较内容System.out.println(s1.equals(s2)); // true(内容都是abc)System.out.println(s3.equals("abc")); // true}}
  • 字符串常用方法:

    方法名说明
    length()求字符串长度,如"abc".length()是 3
    charAt(int index)取指定索引的字符,索引从 0 开始,如"abc".charAt(1)是 ‘b’
    substring(int begin, int end)截取子字符串,含 begin,不含 end,如"abcde".substring(1,3)是 “bc”
    replace(CharSequence target, CharSequence replacement)替换字符串,如"abc".replace(“a”, “x”)是 “xbc”
    split(String regex)按规则分割字符串,返回字符串数组,如"a,b,c".split(“,”)得到[“a”,“b”,“c”]
  • 代码验证(替换和分割):

      public class StringMethodDemo {public static void main(String[] args) {// 替换敏感词String str = "你好TMD,这是GDX";String newStr = str.replace("TMD", "***").replace("GDX", "***");System.out.println(newStr); // 你好***,这是***// 分割手机号String phone = "138-1234-5678";String[] arr = phone.split("-");for (String s : arr) {System.out.println(s); // 138  1234  5678}}}

7.3 StringBuilder

  • 介绍:一个可变的字符串容器,专门用来高效拼接和反转字符串。比如拼接多个字符串时,用它比 String 效率高很多,因为 String 每次拼接都会生成新对象,而它直接在原有容器里改

  • 基本用法:

    • 创建对象:

      • StringBuilder sb = new StringBuilder(); 空容器

      • StringBuilder sb = new StringBuilder("初始内容"); 带初始值,如new StringBuilder("abc")

    • 常用方法:

      • append(内容):添加内容,支持各种类型(字符串、数字、布尔等),如sb.append("x").append(123)

      • reverse():反转字符串,如sb.reverse()把 “abc” 变成 “cba”

      • toString():转成 String 对象,如String str = sb.toString();

  • 代码验证(拼接和反转):

      public class StringBuilderDemo {public static void main(String[] args) {// 拼接字符串StringBuilder sb = new StringBuilder();sb.append("Hello").append(" ").append("World");System.out.println(sb); // Hello World// 反转字符串sb.reverse();System.out.println(sb); // dlroW olleH// 转成StringString str = sb.toString();System.out.println("转成String:" + str); // dlroW olleH}}
  • 链式编程:方法可以连续调用,比如sb.append("a").append("b").reverse();,代码更简洁

  • 例子:

      String result = new StringBuilder().append("开始").append("拼接").append("多个").append("内容").reverse() // 反转整个字符串.toString();System.out.println(result); // 容内个多接拼始开

7.4 StringJoiner

  • 介绍:和 StringBuilder 类似,也是可变字符串容器,但更适合按固定格式拼接字符串,比如用指定分隔符连接多个元素,或者添加首尾符号

  • 基本用法:

    • 创建对象并指定分隔符StringJoiner sj = new StringJoiner("分隔符");

      new StringJoiner(","),元素用 “,” 分隔

    • 带首尾符号的创建StringJoiner sj = new StringJoiner("分隔符","前缀","后缀");

      new StringJoiner(",", "[", "]"),结果像[a, b, c]

    • 添加元素:用add("元素")添加,如sj.add("a").add("b")

  • 代码验证:

      import java.util.StringJoiner;public class StringJoinerDemo {public static void main(String[] args) {// 普通用法(用“, ”分隔)StringJoiner sj1 = new StringJoiner(", ");sj1.add("苹果").add("香蕉").add("橘子");System.out.println(sj1); // 苹果, 香蕉, 橘子// 带首尾符号([ ]包裹,用“, ”分隔)StringJoiner sj2 = new StringJoiner(", ", "[", "]");sj2.add("周一").add("周二").add("周三");System.out.println(sj2); // [周一, 周二, 周三]// 转成StringString str = sj2.toString();System.out.println("转成String:" + str); // [周一, 周二, 周三]}}

7.5 字符串原理

  • 字符串存储位置:

    • 直接赋值(如String s = "abc";:“abc” 存在字符串常量池(JVM 的一块特殊内存区域),如果常量池里已有 “abc”,s 直接指向它,不会新建

    • new 创建(如String s = new String("abc");

      • 先检查常量池有没有 “abc”,没有就先创建到常量池

      • 然后在堆内存里新建一个 String 对象,指向常量池的 “abc”

      • 所以s1 = new String("a"); s2 = new String("a");时,常量池有一个 “a”,堆里有两个 String 对象,都指向常量池的 “a”

  • == 和 equals 的区别总结:

    场景==equals
    基本数据类型(如 int)比数值是否相等不能用(基本类型没有 equals 方法)
    引用数据类型(如 String)比对象地址是否相同比对象内容是否相同(String 重写了 equals 方法)
  • 例子:

      public class StringMemoryDemo {public static void main(String[] args) {String s1 = "abc"; // 常量池创建“abc”String s2 = "abc"; // s2直接指向常量池的“abc”,地址相同System.out.println(s1 == s2); // true(地址相同)String s3 = new String("abc"); // 堆里新建对象,指向常量池的“abc”String s4 = new String("abc"); // 堆里又新建对象,指向同一个“abc”System.out.println(s3 == s4); // false(堆里地址不同)System.out.println(s3.equals(s4)); // true(内容都是“abc”)}}
  • 为什么 StringBuilder 拼接效率高

    • String 拼接时会生成新对象,比如s = s + "a",每次拼接都要创建新的 String 对象,效率低

    • StringBuilder 直接在内部数组里操作,不会频繁创建新对象,拼接效率高很多,尤其适合大量拼接的场景(如循环里拼接)

相关文章:

【七. Java字符串操作与StringBuilder高效拼接技巧】

7. java字符串 7.1 API 介绍:应用程序编程接口。在 Java 中,API 指的是 JDK 提供的各种功能类,这些类把底层实现封装好了,我们不用关心内部怎么写的,直接用就行 用 API 帮助文档步骤:以查Random类为例 打…...

题解:洛谷 P12672 「LAOI-8」近期我们注意到有网站混淆视听

设 LGR 存在数量为 x x x,CSP 存在数量为 y y y。 很明显,我们只需要将其中数量较小的一方改没就行了(一个巴掌拍不响)。 每两个字符串可同意进行一次更改,答案为: ⌈ min ⁡ ( x , y ) 2 ⌉ \left\lce…...

HTML 计算网页的PPI

HTML 计算网页的PPI vscode上安装live server插件&#xff0c;可以实时看网页预览 有个疑问&#xff1a; 鸿蒙density是按照类别写死的吗&#xff0c;手机520dpi 折叠屏426dpi 平板360dpi <html lang"en" data - overlayscrollbars - initialize><header&…...

WIN11+eclipse搭建java开发环境

环境搭建&#xff08;WIN11ECLIPSE&#xff09; 安装JAVA JDK https://www.oracle.com/cn/java/technologies/downloads/#jdk24安装eclipse https://www.eclipse.org/downloads/ 注意&#xff1a;eclipse下载时指定aliyun的软件源&#xff0c;后面安装会快一些。默认是jp汉化e…...

Linux 环境下C、C++、Go语言编译环境搭建秘籍

引言 在当今多元化的编程世界里&#xff0c;C、C 和 Go 语言凭借各自独特的优势&#xff0c;在不同的领域发光发热。C 语言作为一门古老而强大的编程语言&#xff0c;以其高效、贴近硬件的特性&#xff0c;在操作系统、嵌入式系统等底层开发中占据着重要地位&#xff1b;C 作为…...

MMR-Mamba:基于 Mamba 和空间频率信息融合的多模态 MRI 重建|文献速递-深度学习医疗AI最新文献

Title 题目 MMR-Mamba: Multi-modal MRI reconstruction with Mamba and spatial-frequency information fusion MMR-Mamba&#xff1a;基于 Mamba 和空间频率信息融合的多模态 MRI 重建 01 文献速递介绍 磁共振成像&#xff08;MRI&#xff09;因其无创、无辐射特性以及…...

2.5/Q2,Charls最新文章解读

文章题目&#xff1a;Trajectories of depressive symptoms and risk of chronic liver disease: evidence from CHARLS DOI&#xff1a;10.1186/s12876-025-03943-7 中文标题&#xff1a;抑郁症状的轨迹和慢性肝病风险&#xff1a;来自 CHARLS 的证据 发表杂志&#xff1a;BM…...

Unity QFramework 简介

目录 什么是MVC模式&#xff1f; QFramework 架构提供了 Model 的概念 QFramework 架构引入 Command 的方式 QFramework 架构引入 Event事件机制 四个层&#xff1a;表现层、系统层、数据层、工具层 委托和回调函数的关系 命令和事件的区别 工具篇 QFramework整体基于M…...

C++ 日志系统实战第五步:日志器的设计

全是通俗易懂的讲解&#xff0c;如果你本节之前的知识都掌握清楚&#xff0c;那就速速来看我的项目笔记吧~ 本文项目代码编写收尾&#xff01; 日志器类 (Logger) 设计&#xff08;建造者模式&#xff09; 日志器主要用于和前端交互。当我们需要使用日志系统打印 log 时&…...

@Docker Compose部署Alertmanager

文章目录 Docker Compose部署Alertmanager1. 准备工作1.1 系统要求1.2 目录结构准备 2. 配置文件准备2.1 创建docker-compose.yml文件2.2 创建Alertmanager配置文件 3. 部署Alertmanager3.1 启动服务3.2 验证服务状态3.3 检查日志 4. 服务验证4.1 访问Web UI 4.2 API健康检查5.…...

前端面试准备-3

1.let、const、var的区别 ①&#xff1a;let和const为块级作用域&#xff0c;var为全局作用域 ②&#xff1a;let和var可以重新赋值定义&#xff0c;而const不可以 ③&#xff1a;var会提升到作用域顶部&#xff0c;但不会初始化&#xff1b;let和const也会提升到作用不顶部…...

性能测试-jmeter实战1

课程&#xff1a;B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 性能测试-jmeter实战1 为什么需要性能测试呢&#xff1f;性能测试的作用&#xff1f;性能测试体系性能测试基础性能测试工具性能监控…...

汽车高速通信的EMC挑战

随着“软件定义汽车”的理念全面渗透,中国汽车行业正加速向集中式电子电气架构(E/E架构)转型。SOA(面向服务的架构)理念推动下,整车开始围绕中央计算平台(OIB)与分布式域控制器(VIU)构建,硬件平台具备前所未有的数据处理能力,能掌控整车控制与实时感知决策。 一、…...

[SC]SystemC在CPU/GPU验证中的应用(五)

SystemC在CPU/GPU验证中的应用(五) 摘要:下面分享50个逐步升级SystemC编程能力的示例及建议的学习路线图。您可以一次一批地完成它们——从前五个基础的例子开始,然后转向channels, TLM, bus models, simple CPU/GPU kernels等等。在每个阶段掌握之后,再进行下一组…...

[蓝桥杯C++ 2024 国 B ] 立定跳远(二分)

题目描述 在运动会上&#xff0c;小明从数轴的原点开始向正方向立定跳远。项目设置了 n n n 个检查点 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots , a_n a1​,a2​,⋯,an​ 且 a i ≥ a i − 1 > 0 a_i \ge a_{i−1} > 0 ai​≥ai−1​>0。小明必须先后跳跃到每个检查…...

现代网络安全攻防技术与发展现状

1. 引言 随着数字化转型进程的加速&#xff0c;全球信息化程度不断深入&#xff0c;网络安全问题日益凸显。根据最新的统计数据&#xff0c;2022年全球范围内的网络攻击事件较前一年增长了约41%&#xff0c;造成的经济损失高达超过6万亿美元。在这个背景下&#xff0c;了解现代…...

杏仁海棠花饼的学习日记第十四天CSS

一&#xff0c;前言 第二天&#xff0c;今天看CSS。 二&#xff0c;CSS简介及导入方式 CSS简介 CSS&#xff08;层叠样式表&#xff0c;Cascading Style Sheets&#xff09;是一种用于描述 HTML 或 XML&#xff08;包括 SVG、XHTML 等&#xff09;文档呈现效果的样式语言。…...

ESP8266远程控制:实现网络通信与设备控制

概述&#xff1a; 最近一直在弄esp8266的网络通信&#xff0c;但是一直都还没搞懂到底esp8266可不可以通过连接一个网络过后&#xff0c;在很远的地方使用网络将其关掉 在网上找了两个教程都有程序&#xff0c;都跑通了 第一个 第二个找不到了&#xff0c;但是程序有 CSDN上放文…...

RabbitMQ监控:关键技术、技巧与最佳实践

RabbitMQ作为企业级消息中间件的核心组件&#xff0c;其稳定性和性能直接影响分布式系统的可靠性。有效的监控不仅能帮助快速定位问题&#xff0c;还能优化系统资源分配&#xff0c;预防潜在故障。本文基于RabbitMQ官方文档&#xff0c;深入探讨其监控的技术方案、实践技巧及最…...

【机器学习基础】机器学习入门核心算法:隐马尔可夫模型 (HMM)

机器学习入门核心算法&#xff1a;隐马尔可夫模型 &#xff08;HMM&#xff09; 一、算法逻辑与核心思想二、算法原理与数学推导核心问题与算法推导 三、模型评估四、应用案例1. 语音识别 (Speech Recognition)2. 自然语言处理 (Natural Language Processing - NLP)3. 手写体识…...

zookeeper 操作总结

zookeeper 中的节点类型 节点类型命令选项说明‌持久节点‌无选项&#xff08;默认&#xff09;永久存在&#xff0c;除非手动删除。‌临时节点‌-e与客户端会话绑定&#xff0c;会话结束自动删除&#xff08;‌不能有子节点‌&#xff09;。‌顺序节点‌-s节点名自动追加递增…...

golang 实现基于redis的并行流量控制(计数锁)

在业务开发中&#xff0c;有时需要对某个操作在整个集群中限制并发度&#xff0c;例如限制大模型对话的并行数。基于redis zset实现计数锁&#xff0c;做个笔记。 关键词&#xff1a;并行流量控制、计数锁 package redisutilimport ("context""fmt""…...

Leetcode 2819. 购买巧克力后的最小相对损失

1.题目基本信息 1.1.题目描述 现给定一个整数数组 prices&#xff0c;表示巧克力的价格&#xff1b;以及一个二维整数数组 queries&#xff0c;其中 queries[i] [ki, mi]。 Alice 和 Bob 去买巧克力&#xff0c;Alice 提出了一种付款方式&#xff0c;而 Bob 同意了。 对于…...

AI炼丹日志-25 - OpenAI 开源的编码助手 Codex 上手指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; Java篇&#xff1a; MyBatis 更新完毕目前开始更新 Spring&#xff0c;一起深入浅出&#xff01; 大数据篇 300&#xff1a; Hadoop&…...

AnyConv OGG 转换器:轻松转换音频格式

在数字音频世界中,不同的文件格式适用于不同的场景和设备。OGG 是一种开放、免费的音频格式,具有高压缩率和良好的音质。然而,有时我们需要将 OGG 文件转换为其他格式,或者将其他格式转换为 OGG。这就是 AnyConv OGG 转换器发挥作用的地方。 什么是 AnyConv OGG 转换器? …...

C# 类和继承(使用基类的引用)

使用基类的引用 派生类的实例由基类的实例和派生类新增的成员组成。派生类的引用指向整个类对象&#xff0c;包括 基类部分。 如果有一个派生类对象的引用&#xff0c;就可以获取该对象基类部分的引用&#xff08;使用类型转换运算符把 该引用转换为基类类型&#xff09;。类…...

进程间通信(消息队列)

目录 一 原理 二 API 1. ftok 2. msgget 3. msgctl 4. msgsnd 5. msgrcv 三 demo代码 四 基于责任链模式和消息队列对数据处理 1. 什么是责任链模式 2. 下面基于责任链模式来对消息队列获取的消息进行处理 前置 其实system v 版本的进程间通信&#xff0c;设计的接…...

Linux gron 命令使用详解

简介 gron 是一个独特的命令行工具&#xff0c;用于将 JSON 数据转换为离散的、易于 grep 处理的赋值语句格式。它的名字来源于 “grepable on” 或 “grepable JSON”&#xff0c;主要解决在命令行中处理复杂 JSON 数据的难题。 核心价值 gron 的核心是将 JSON 数据展平为类…...

Nginx--手写脚本压缩和切分日志(也适用于docker)

原文网址&#xff1a;Nginx--手写脚本压缩和切分日志&#xff08;也适用于docker&#xff09;_IT利刃出鞘的博客-CSDN博客 简介 本文介绍nginx如何手写脚本压缩和切分日志。 1.创建切分日志的脚本 创建脚本文件&#xff1a;/work/tmp/nginx-log_sh&#xff08;后边要用run-…...

OpenCv高阶(十八)——dlib人脸检测与识别

文章目录 一、dlib库是什么&#xff1f;二、opencv库与dlib库的优缺点对比1、opencv优缺点2、dlib库优缺点 三、dlib库的安装1、在线安装2、本地安装 四、dlib库的人脸检测器1. 基于 HOG 的检测器2. 基于 CNN 的检测器 五、dlib人脸检测的简单使用1、导入必要库2、初始化人脸检…...