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

[Java 基础]String 类

字符串是编程中最常用的数据类型,在 Java 中,字符串不是基本数据类型,而是一个类,位于 java.lang 包中。这意味着我们可以像操作其他对象一样操作字符串。String 类提供了丰富的方法,用于创建、比较、连接、截取、查找和修改字符串等操作。

创建一个 String 字符串对象,最直接、最常用的方法就是将字符串用双引号括起来赋值给 String 类型的变量。

String message = "Hello Java!";
String name = "小明";
String empty = ""; // 空字符串

String 对象有一个非常重要的特性是不可变性 (Immutability),这意味着一旦一个 String 对象被创建,它的内容就不能被修改。任何看似修改字符串的操作,实际上都会创建一个新的 String 对象。让我们通过一个例子来理解:

public class StringImmutableDemo {public static void main(String[] args) {String str1 = "Hello";String str2 = str1; // str2 指向 str1 相同的对象System.out.println("修改前:");System.out.println("str1 = " + str1);System.out.println("str2 = " + str2);// 尝试修改 str1str1 = str1 + " World"; // 实际上是创建了一个新的字符串对象System.out.println("\n修改后:");System.out.println("str1 = " + str1);System.out.println("str2 = " + str2);}
}

上面的代码的执行结果是:

如果 String 是可变的,那么当 str1 = str1 + " World" 执行时,它会直接修改 str1 原来指向的那个 “Hello” 对象的内容,变成 “Hello World”。由于 str2 最初也指向同一个对象,那么在修改后,str2 的值也应该变成 “Hello World”。

但是,实际运行结果是 str2 的值保持不变(仍然是 “Hello”)。这明确地表明,对 str1 执行的连接操作并没有改变原始的 “Hello” 字符串对象。它只是让 str1 指向了一个全新的字符串对象,而 str2 仍然指向那个未被修改的原始 “Hello” 对象。

String 类的常用方法

length

返回字符串的长度(包含的字符数)。

String message = "Hello";
int length = message.length(); // length 的值为 5

charAt

返回指定索引位置的字符。索引从 0 开始。

String word = "Java";
char firstChar = word.charAt(0); // firstChar 的值为 'J'
char lastChar = word.charAt(3);  // lastChar 的值为 'a'

concat

将指定的字符串连接到该字符串的末尾,返回一个新的字符串。

String str1 = "Hello";
String str2 = " World";
String result = str1.concat(str2); // result 的值为 "Hello World"

substring

返回一个新的字符串,它是此字符串从 beginIndex 开始到末尾的子字符串,它还有一个有两个参数的方法,指定截取的起始下标和截取的长度。

String text1 = "Programming";
String sub1 = text1.substring(4); // sub1 的值为 "ramming"String text2 = "Programming";
String sub2 = text2.substring(0, 4); // sub2 的值为 "Prog"

equals

将此字符串与指定的对象进行比较。只有当对象也是一个 String 并且包含与此字符串相同的字符序列时,结果才为 true

String s1 = "Hello";
String s2 = "Hello";
String s3 = new String("Hello");
System.out.println(s1.equals(s2)); // 输出 true
System.out.println(s1.equals(s3)); // 输出 true
System.out.println(s1 == s3);     // 输出 false (比较的是对象的引用)

:::color3
比较字符串内容是否相等应该使用 equals() 方法,而不是 == 运算符。== 运算符比较的是两个对象的引用是否指向同一个内存地址。

:::

toLowerCase 和 toUpperCase

将字符串全部小写或全部大写。

String upperCase = "HELLO";
String lowerCase = upperCase.toLowerCase(); // lowerCase 的值为 "hello"
String lowerCase2 = "world";
String upperCase2 = lowerCase2.toUpperCase(); // upperCase2 的值为 "WORLD"

equalsIgnoreCase

忽略大小写进行比较两个字符串内容是否相等。

String strA = "java";
String strB = "Java";
System.out.println(strA.equalsIgnoreCase(strB)); // 输出 true

trim

返回一个新的字符串,它是此字符串删除了前导和尾部空白的副本。

String stringWithSpaces = "   Extra spaces   ";
String trimmedString = stringWithSpaces.trim(); // trimmedString 的值为 "Extra spaces"

split

根据给定的正则表达式将此字符串拆分为字符串数组。

String data = "apple,banana,orange";
String[] fruits = data.split(","); // fruits 的值为 ["apple", "banana", "orange"]

基本上 String 类提供的这些方法够用,但是一些三方包中提供了额外的非常好用的关于字符串的一些工具类,比如: Apache Commons Lang - StringUtils这个类。

http://www.xdnf.cn/news/13082.html

相关文章:

  • MCP和Function Calling
  • OpenCV CUDA模块光流计算-----实现Farneback光流算法的类cv::cuda::FarnebackOpticalFlow
  • Spring Boot 与 Kafka 的深度集成实践(二)
  • Flink 系列之二十二 - 高级概念 - 保存点
  • Linux命令cat /proc/net/snmp查看网络协议层面统计信息
  • 项目管理进阶:解析112页IPD集成产品开发高层培训【附全文阅读】
  • 秋叶包ComfyUI 新手入门攻略及实战指南
  • 11_数据表示与特征工程
  • 华为OD机试-最短木板长度-二分法(A卷,100分)
  • .Net 优秀框架 ABP全面详解
  • 推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
  • 第三章:局域网
  • FDA方向图的matlab仿真实现
  • 河北对口计算机高考MySQL笔记(完结版)(2026高考)持续更新~~~~
  • 【Elasticsearch基础】Elasticsearch批量操作(Bulk API)深度解析与实践指南
  • RocketMQ 客户端负载均衡机制详解及最佳实践
  • FFmpeg介绍
  • AI-Python机器学习与深度学习实践技术应用
  • 苹果端Cursor免费额度与模型受限终极解决方案
  • 【Elasticsearch】一个图书馆的案例解释 Elasticsearch
  • Pandas 可视化集成:数据科学家的高效绘图指南
  • 协议转换利器,profinet转ethercat网关的两大派系,各有千秋
  • C#中清空DataGridView的方法
  • RKNN开发环境搭建2-RKNN Model Zoo 环境搭建
  • DAY 26 函数专题1:函数定义与参数
  • 【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
  • ASR(语音识别)语音/字幕标注 通过via(via_subtitle_annotator)
  • pytorch卷积层权重之 二维互相关运算(corr2d) (亲测,已解决)
  • 华为云CAE部署spring cloud服务
  • MCU ADC硬件设计注意事项