【Java】String类的基础用法与应用指南

一、前言

在 Java 中,String类型是一种非常常用的引用数据类型,用于表示字符串。字符串在Java内部通过char[]数组表示,而String类提供了丰富的方法用于字符串的操作和处理。

本文将记录 String 类的一些基础用法。

二、内容

2.1 概述

(1)什么是 String ?

在 Java 中,String是一种引用数据类型,是一种可以用来表示字符串的类。

java 复制代码
String str = "Hello World!";

实际上,字符串在 String 内部是通过一个 char[] 数组表示的,每个字符串都是一个字符数组,类似这样:

java 复制代码
String str = new String(new char[]{'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!'});

这个字符数组存储了字符串中每个字符的信息。由于字符串的不可变性,一旦创建,这个字符数组就不能被修改。

此外,在较新的JDK版本中,String是以byte[]数组形式进行存储的。

由于 String 太常用了,因此Java提供了一种特殊的字符串表示法,即字符串字面量(String literals),使用双引号"括起来的字符序列。

这样我们就可以直接指定字符串而不必使用new关键字创建String对象。

(2)不可变性

String对象是不可变的,一旦创建就不能被修改。

任何对字符串的操作实际上都会创建一个新的字符串对象,而不是在原有的对象上进行修改。

java 复制代码
String str = "Hello World!";

在这里,"Hello World!" 就是一个字符串字面量。Java编译器会自动将这个字符串字面量转换为一个String对象,并将其存储在字符串池中。因为字符串字面量在池中是唯一的,所以如果你在不同的地方使用相同的字符串字面量,它们将引用相同的对象。

2.2 字符串比较

在Java中,字符串的比较主要有两种方式:基于值的比较和基于引用的比较。

(1)基于值的比较

当我们想要比较两个字符串是否相同时,一般都是想比较字符串的内容是否相同(此时是基于值的比较)。

在Java中,可以使用equals方法进行值的比较。

equals方法是Object类中的方法,被String类覆盖重写以进行字符串内容的比较。

在上面的例子中,equals方法会比较字符串的内容,如果内容相同,则返回true,否则返回false

(2)基于引用的比较

一旦我们使用==运算符来比较两个字符串,实际上是基于引用的比较,换句话说,是比较两个字符串对象的引用是否指向相同的内存地址。

使用==运算符意味着会检查两个字符串是否是同一个对象。

在上面的例子中,由于字符串常量池的存在,相同的字符串字面量会被合并,因此str1str2实际上引用相同的字符串对象。

(3)小结

虽然从表面上看,两个字符串用==equals()比较都为true,但实际上用==比较两个字符串是否相等时,可能会受到字符串池的影响。

当字符串是通过字符串字面量形式创建时,Java编译器会自动将相同的字符串字面量合并为一个对象,并将其放入字符串池中。

如果我们换一种方式来创建字符串对象,就会发现不同:

在这种情况下,虽然字符串的内容相同,但是由于使用了new关键字,两个字符串对象分别在堆内存中创建,所以s1s2的引用并不相同,==比较会返回false

或者这样:

尽管两个字符串的内容相同("hello"),但是由于 toLowerCase() 方法返回一个新的字符串对象,它在内存中拥有不同的引用。因此,== 操作符会返回 false

因此,当我们需要比较两个字符串的内容时,必须使用 equals()方法。

  • 备注:

需要忽略字符串的大小写进行比较时,可以使用equalsIgnoreCase()方法

2.3 字符串拼接

String 类提供了 join() 静态方法,用于连接多个字符串。这方法通过指定分隔符将一组字符串连接成一个单独的字符串。

String.join() 方法的参数是一个 CharSequence(字符序列),因此可以用于连接任何实现了 CharSequence 接口的对象。

或者,我们也可以这样:

2.4 字符串格式化

在上述例子中,%s%d 是格式化占位符,表示字符串和整数。String.format() 方法将占位符替换为实际的值,最终得到格式化后的字符串。

常用的占位符有:

  • %s:显示字符串
  • %d:显示整数
  • %x:显示十六进制整数
  • %f:显示浮点数
  • %b: 布尔值
  • %c: 字符

占位符还可以带格式,通过添加修饰符来控制输出的格式。

比如:

在这个例子中,%10d 表示整数至少占10个字符宽度。如果实际宽度不足10个字符,将在左侧填充空格,使得总宽度为10。

在这个例子中,%.2f 表示浮点数保留两位小数。

2.5 子串

在Java中,可以使用一些字符串方法来搜索子串和提取子串。

(1)搜索子串

contains() 方法检查字符串是否包含指定的子字符串。

indexOf() 方法返回指定子字符串在原字符串中第一次出现的索引,如果没有找到则返回 -1。

lastIndexOf 方法返回指定子字符串在原字符串中最后一次出现的索引,如果没有找到则返回 -1。

startsWith 方法检查字符串是否以指定的前缀开始。

endsWith 方法检查字符串是否以指定的后缀结束。

(2)提取子串

substring() 方法用于从原字符串中提取子串,可以根据起始索引和结束索引来提取。

split() 方法可以根据指定的表达式将字符串分割成子字符串数组,然后可以取得数组中的特定元素。

(3)替换子串

使用 replace() 方法来替换字符串中的子串。

replace() 方法将字符串中的 "World" 替换为 "Java",并返回一个新的字符串。

另外,还可以使用 replaceAll() 方法,传入正则表达式作为参数:

2.6 类型互转

在Java中,可以使用 valueOf() 方法将任意基本类型或引用类型转换为字符串。这方法是String类的一个静态方法。

String.valueOf() 方法被用来将不同类型的数据转换为字符串。它会自动调用对象的 toString() 方法(如果对象非空),或者对于基本类型,会直接将其转换为字符串表示。

当需要将字符串转换为其他类型时,具体的方法取决于目标类型。

  • 转换为整数类型(int)
  • 转换为浮点数类型(double)

另外,字符数组和String类型的变量也可以相互转换。可以使用toCharArray()方法将字符串转换为字符数组,也可以使用String类的构造函数将字符数组转换为字符串。

2.7 其他方法

trim() 方法用于移除字符串首尾的空白字符,包括空格,制表符,回车符和换行符。

strip() 方法类似于 trim(),用于移除字符串首尾的空白字符,不同之处在于它还能移除一些 Unicode 空白字符,例如中文的空格字符 \u3000

stripLeading()stripTrailing() 方法分别用于移除字符串开头和结尾的空白字符。

isEmpty()isBlank() 方法分别用于判断字符串是否为空(长度为0)和是否为空白字符串(只包含空白字符)。

三、总结

总的来说,String类是比较常用的,希望通过本文可以了解 String 类的基础用法。

相关推荐
来深圳4 分钟前
leetcode 739. 每日温度
java·算法·leetcode
王中阳Go5 分钟前
Golang框架封神榜!GitHub星标TOP8大比拼,选对框架少走3年弯路
后端·面试·go
CC大煊8 分钟前
【java】Druid数据库连接池完整配置指南:从入门到生产环境优化
java·数据库·springboot
扑克中的黑桃A8 分钟前
当中断绑核遇上大模型推理:HostBound 问题优化全解析(昇腾深度实战版)
后端
七月丶14 分钟前
实战复盘:我为什么把 TypeScript 写的 CLI 工具用 Rust 重写了一遍?
前端·后端·rust
JIngJaneIL21 分钟前
基于java+ vue交友系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·交友
王中阳Go24 分钟前
05 Go Eino AI应用开发实战 | Docker 部署指南
人工智能·后端·go
普通网友27 分钟前
Bash语言的图算法
开发语言·后端·golang
苹果酱056728 分钟前
解决linux mysql命令 bash: mysql: command not found 的方法
java·vue.js·spring boot·mysql·课程设计
雨岚霏34 分钟前
Bash语言的数据库编程
开发语言·后端·golang