【Java】String类API

创建字符串

字符串字面量"Hello"高效,常量池复用常见、简单的字符串创建
new 关键字new String("Hello")每次创建新对象,性能开销较高显式创建新对象
字符数组new String(char[])转换字符数组字符数组转字符串
StringBuilder/StringBuffersb.toString()可变字符串,高效频繁修改字符串
String.formatString.format()动态格式化动态内容和格式输出
String.valueOfString.valueOf()基本类型和对象转字符串类型转换
String.joinString.join()多字符串高效拼接多个字符串拼接
concat 方法str1.concat(str2)简单拼接简单场景拼接
substringstr.substring(0, 5)提取子串提取部分字符串
String.internstr.intern()常量池优化内存内存优化
字节数组new String(byte[])解码字节数组网络/文件数据转换为字符串

1.字符串字面量

String str = "Hello";

特点

  • 字符串字面量存储在 字符串常量池 中。
  • 如果常量池中已经存在相同的字符串,则不会创建新对象,直接返回池中已有的引用。

适用场景

  • 用于创建重复使用的常量字符串

2.使用new关键字

String str = new String("Hello");

特点

  • 如果字符串常量池没有"Hello"字面量,会先创建一个,然后每次new都会在堆内存中创建一个新的String对象,内容相同的都会引入字符串常量池中的字面量
  • 不推荐直接使用new创建字符串,除非明确需要

适用场景

  • 显式要求在堆内存中创建独立的字符串对象。

3.字节数组

byte[] bytes = "黄小桃".getBytes();
// byte[] bytes = {72, 101, 108, 108, 111}; // ASCII for "Hello"
String string = new String(bytes);
System.out.println(string);

特点

  • 将字节数组解码为字符串。
  • 默认使用平台的字符集,也可指定字符集(如 UTF-8)。

适用场景

  • 从网络、文件中读取的字节数据转换为字符串。

4.字符数组

char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);

特点

  • 将字符数组转换为字符串。
  • 不会将字符数组的内容直接放入常量池,而是在堆中创建一个字符串对象

适用场景

  • 字符数组需要拼接或转为字符串时

5.使用StringBuilder或StringBuffer

StringBuilder sb = new StringBuilder("Hello");
sb.append(" World");
String str = sb.toString();

特点

  • 适合频繁修改字符串的场景(如拼接、删除等操作)。
  • StringBuilder 非线程安全StringBuffer 是线程安全的。

适用场景

  • 需要高效地构建字符串,避免频繁创建新对象。

6.使用String.format

        String str = String.format("Hello,%s!", "World");System.out.println(str); // Hello,World!

特点

  • 支持格式化操作,类似于 printf 的功能。
  • 可指定格式控制符(如 %d, %s

%s引用字符串

%d引用整型

适用场景

  • 动态格式化字符串。

7.String.valueOf()转型

int num = 42;
String str = String.valueOf(num);

特点

  • 将基本类型(如 int, double)或对象转为字符串。
  • 如果传入的是 null,返回 "null"

适用场景

  • 将非字符串的基本类型转换为字符串。

8.使用String.join()

特点

  • Java 8 引入的工具方法,用于高效拼接字符串。
  • 可以指定分隔符,拼接多个字符串。

适用场景

  • 多个字符串的高效拼接。

9.使用concat方法

String str1 = "Hello";
String str2 = " World";
String str = str1.concat(str2);

特点

  • 直接拼接两个字符串,功能类似于 +
  • + 不同,concat 只能拼接字符串,不能拼接其他类型。

适用场景

  • 简单的字符串拼接。

10.使用substring

String original = "Hello, World!";
String subStr = original.substring(0, 5); // "Hello"

特点

  • 从原字符串提取子串,生成新的字符串。
  • 新字符串仍然是不可变的。

适用场景

  • 提取部分字符串。

11.使用String.intern()

String str = new String("Hello").intern();

特点

  • 将字符串对象放入字符串常量池,如果池中已存在相同内容的字符串,则返回池中的引用。
  • 用于减少内存占用。

适用场景

  • 手动优化内存使用,减少重复字符串对象。

12.使用Arrays.asListString.join

String str = String.join(", ", Arrays.asList("Apple", "Banana", "Cherry"));

特点

  • 利用 String.joinList 数据实现快速拼接。

适用场景

  • 列表中的数据拼接为字符串。

字符串基本方法

1.获取字符串长度

String str = "Hello";
int length = str.length(); // 5

2.获取字符

String str = "Hello";
char c = str.charAt(1); // 'e'

3.查找子串或字符

String str = "Hello, World!";
int index = str.indexOf("World"); // 7
int lastIndex = str.lastIndexOf('o'); // 8
boolean contains = str.contains("Hello"); // true

4.字符串比较

String str1 = "apple";
String str2 = "banana";boolean isEqual = str1.equals(str2); // false
boolean ignoreCase = str1.equalsIgnoreCase("APPLE"); // true
int compare = str1.compareTo(str2); // 按字典序比较,返回负值表示 str1 < str2

5.判断前缀或后缀

String str = "hello.java";
boolean startsWith = str.startsWith("hello"); // true
boolean endsWith = str.endsWith(".java"); // true

6.判断是否为空

String str = "";
boolean isEmpty = str.isEmpty(); // true

7.字符串截取

String str = "Hello, World!";
String subStr1 = str.substring(0, 5); // "Hello"
String subStr2 = str.substring(7);    // "World!"

8.字符串替换

String str = "Hello, World!";
String replaced = str.replace("World", "Java"); // "Hello, Java!"
String replacedAll = str.replaceAll("\\s", "_"); // 用正则替换,"Hello,_World!"

9.删除前后空格

String str = "   Hello, World!   ";
String trimmed = str.trim(); // "Hello, World!"

10.分割字符串

String str = "Apple,Banana,Cherry";
String[] fruits = str.split(","); // ["Apple", "Banana", "Cherry"]

11.拼接字符串

String joined = String.join("-", "Apple", "Banana", "Cherry"); // "Apple-Banana-Cherry"

12.转换大小写

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

13.转换为字符数组

String str = "Hello";
char[] chars = str.toCharArray(); // ['H', 'e', 'l', 'l', 'o']

14.转换为字节数组

String str = "Hello";
byte[] bytes = str.getBytes(); // 按默认编码转换

15.格式化字符串

%s引用字符串

%d引用整型

String formatted = String.format("Hello, %s! You have %d messages.", "John", 5);
// 输出: "Hello, John! You have 5 messages."

16.判断字符串是否匹配正则

String str = "123abc";
boolean matches = str.matches("\\d+"); // false(因为包含字母)

17.判断是否为空或仅包含空白字符

String str = "   ";
boolean isBlank = str.trim().isEmpty(); // true

18.字符串构建

StringBuilder 是 Java 中推荐的可变字符串操作类。

但是线程不安全,所以多线程环境下最好用StringBuffer

StringBuilder sb = new StringBuilder("Hello");
sb.append(", World!"); // 拼接字符串
sb.insert(5, " Java"); // 插入字符串
sb.delete(5, 10);      // 删除指定范围的字符
sb.reverse();          // 反转字符串
System.out.println(sb.toString()); // "!dlroW ,olleH"

19.连续空格替换成单个空格

String str = "Hello    World!";
String normalized = str.replaceAll("\\s+", " "); // "Hello World!"

20.保留字符串中的数字

String str = "abc123def456";
String digits = str.replaceAll("\\D", ""); // "123456"

21.替换首尾字符

String str = "123-456-789";
String result = str.replaceFirst("^123", "XXX"); // "XXX-456-789"

22.性能优化-字符串拼接

使用 StringBuilder 代替 + 操作

StringBuilder sb = new StringBuilder();
for (int i = 0; i < 10; i++) {sb.append(i).append(", ");
}
System.out.println(sb.toString());

23.使用intern()减少重复字符串

String.intern() 将字符串放入常量池,避免创建重复对象

String str1 = "Hello".intern();
String str2 = new String("Hello").intern();
System.out.println(str1 == str2); // true

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

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

相关文章

数据结构初阶---二叉树---堆

一、树 1.树的概念 树是一种非线性的数据结构&#xff0c;由n(n≥0)个有限结点组成的一个有层次关系的集合。形状类似一棵倒挂的树&#xff0c;根朝上&#xff0c;分支向下。 根结点没有前驱结点&#xff0c;可以有n(n≥0)个后继结点。 其余结点被分为M个互不相交的集合&am…

C语言 字符串输入输出函数、scanf(“%[^\n]“,)可输入空格 、fgets删除换行符

字符串输入函数&#xff1a; scanf&#xff08;"%s"&#xff0c;数组名&#xff09; gets&#xff08;数组名&#xff09; fgets&#xff08;&#xff09; --- 文件流输入函数 函数原型&#xff1a; int scanf( const char *format, ...…

深度学习camp-第J4周:ResNet与DenseNet结合探索

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 本周任务&#xff1a; 探索ResNet和DenseNet的结合可能性本周任务较难&#xff0c;我们在chatGPT的帮助下完成 一、网络的构建 设计一种结合 ResNet 和 Den…

「iOS」通过CoreLocation Framework深入了解MVC架构

「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构 文章目录 「iOS」通过CoreLocation Framework重新了解多界面传值以及MVC架构前言CoreLocation了解根据需求建模设计属性方法设计协议传值Block传值KVONotification通知方式 总结参考文章 前言 在这个学期的前…

ArrayList源码分析、扩容机制面试题,数组和List的相互转换,ArrayList与LinkedList的区别

目录 1.java集合框架体系 2. 前置知识-数组 2.1 数组 2.1.1 定义&#xff1a; 2.1.2 数组如何获取其他元素的地址值&#xff1f;&#xff08;寻址公式&#xff09; 2.1.3 为什么数组索引从0开始呢&#xff1f;从1开始不行吗&#xff1f; 3. ArrayList 3.1 ArrayList和和…

【C++】- 掌握STL List类:带你探索双向链表的魅力

文章目录 前言&#xff1a;一.list的介绍及使用1. list的介绍2. list的使用2.1 list的构造2.2 list iterator的使用2.3 list capacity2.4 list element access2.5 list modifiers2.6 list的迭代器失效 二.list的模拟实现1. list的节点2. list的成员变量3.list迭代器相关问题3.1…

Docker--Docker Container(容器) 之容器实战

对docker容器的前两篇文章 Docker–Docker Container(容器) 之 操作实例 Docker–Docker Container(容器&#xff09; Mysql容器化安装 我们可以先在Docker Hub上查看对应的Mysql镜像,拉取对应的镜像&#xff1a; 拉取mysql5.7版本的镜像&#xff1a; docker pull mysql:5.7…

【汇编语言】内中断(二) —— 安装自己的中断处理程序:你也能控制0号中断

文章目录 前言1. 编程处理0号中断1.1 效果演示1.2 分析所要编写的中断处理程序1.2.1 引发中断1.2.2 中断处理程序1.2.3 中断处理程序do0应该存放的位置1.2.4 中断向量表的修改1.2.5 总结 1.3 程序框架1.4 注意事项1.5 从CPU的角度看中断处理程序1.6 一些问题的思考与解答 2. 安…

VS2019中无法跳转定义_其中之一情况

我习惯了使用VS2019看stm的代码&#xff1b; 遇到的问题&#xff0c;在导入代码后&#xff0c;发现有些函数调用不能跳转到定义&#xff1b; 问题描述步骤 1、导入代码 2、跳转&#xff0c;无法跳转 1、中文路径 2、删除.vs文件 和网上查的都没办法解决 最后发现是VS不支持 …

让 Win10 上网本 Debug 模式 QUDPSocket 信号槽 收发不丢包的方法总结

在前两篇文章里&#xff0c;我们探讨了不少UDP丢包的解决方案。经过几年的摸索测试&#xff0c;其实方法非常简单, 无需修改代码。 1. Windows 下设置UDP缓存 这个方法可以一劳永逸解决UDP的收发丢包问题&#xff0c;只要添加注册表项目并重启即可。即使用Qt的信号与槽&#…

Elasticsearch:ES|QL 中的全文搜索 - 8.17

细心的开发者如果已经阅读我前两天发布的文章 “Elastic 8.17&#xff1a;Elasticsearch logsdb 索引模式、Elastic Rerank 等”&#xff0c;你就会发现在 8.17 的发布版中&#xff0c;有一个重要的功能发布。那就是 ES|QL 开始支持全文搜索了。在今天的文章中我们来尝试一下。…

SQL和Python 哪个更容易自学?

SQL和Python不是一个物种&#xff0c;Python肯定更难学习。如果你从事数据工作&#xff0c;我建议先学SQL、有余力再学Python。因为SQL不光容易学&#xff0c;而且前期的投入产出比更大。 SQL是数据查询语言&#xff0c;场景限于数据查询和数据库的管理&#xff0c;对大部分数据…

【unity】从零开始制作平台跳跃游戏--界面的认识,添加第一个角色!

在上一篇文章中&#xff0c;我们已经完成了unity的环境配置与安装⬇️ 【Unity】环境配置与安装-CSDN博客 接下来&#xff0c;让我们开始新建一个项目吧&#xff01; 新建项目 首先进入unityHub的项目页面&#xff0c;点击“新项目”&#xff1a; 我们这个系列将会以2D平台…

怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev

本文引用怎么禁用 vscode 中点击 go 包名时自动打开浏览器跳转到 pkg.go.dev 在 vscode 设置项中配置 gopls 的 ui.navigation.importShortcut 为 Definition 即可。 "gopls": {"ui.navigation.importShortcut": "Definition" }ui.navigation.i…

Unity3D实现抽象类的应用场景例子

系列文章目录 unity知识点 文章目录 系列文章目录👉前言👉一、示例👉二、使用步骤👉三、抽象类和接口的区别👉3-1、抽象类👉3-2、接口类👉壁纸分享👉总结👉前言 假设我们正在制作一个游戏,游戏中有多种不同类型的角色,这些角色都有一些共同的行为(比如移…

数据仓库工具箱—读书笔记01(数据仓库、商业智能及维度建模初步)

数据仓库、商业智能及维度建模初步 记录一下读《数据仓库工具箱》时的思考&#xff0c;摘录一些书中关于维度建模比较重要的思想与大家分享&#x1f923;&#x1f923;&#x1f923; 博主在这里先把这本书"变薄"~有时间的小伙伴可以亲自再读一读&#xff0c;感受一下…

docker启动一个helloworld(公司内网服务器)

这里写目录标题 容易遇到的问题&#xff1a;1、docker连接问题 我来介绍几种启动 Docker Hello World 的方法&#xff1a; 最简单的方式&#xff1a; docker run hello-world这会自动下载并运行官方的 hello-world 镜像。 使用 Nginx 作为 Hello World&#xff1a; docker…

基于IEEE 802.1Qci的时间敏感网络(TSN)主干架构安全分析及异常检测系统设计

中文标题&#xff1a;基于IEEE 802.1Qci的时间敏感网络&#xff08;TSN&#xff09;主干架构安全分析及异常检测系统设计 英文标题&#xff1a;Security Analysis of the TSN Backbone Architecture and Anomaly Detection System Design Based on IEEE 802.1Qci 作者信息&…

怎样提升企业网络的性能?

企业网络的稳定性和高效性直接影响员工的工作效率。以下从多维度分析了一些有效策略&#xff0c;帮助公司提升网络性能&#xff0c;营造更高效的办公环境。 1. 升级网络设备 采用性能更高的网络硬件是优化网络体验的重要基础。选择支持高吞吐量、低延迟的设备&#xff08;如企业…

力扣239.滑动窗口最大值

文章目录 一、前言二、单调队列 一、前言 力扣239.滑动窗口最大值 滑动窗口最大值&#xff0c;这道题给定一个数组&#xff0c;以及一个窗口的长度&#xff0c;这个窗口会往后滑动&#xff0c;直到数组最后一个元素。 要求每个滑动窗口的中的最大值。对于这道题&#xff0c;我…