【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 类的基础用法。

相关推荐
一只爱打拳的程序猿10 分钟前
【Spring】更加简单的将对象存入Spring中并使用
java·后端·spring
杨荧11 分钟前
【JAVA毕业设计】基于Vue和SpringBoot的服装商城系统学科竞赛管理系统
java·开发语言·vue.js·spring boot·spring cloud·java-ee·kafka
minDuck13 分钟前
ruoyi-vue集成tianai-captcha验证码
java·前端·vue.js
为将者,自当识天晓地。32 分钟前
c++多线程
java·开发语言
daqinzl40 分钟前
java获取机器ip、mac
java·mac·ip
激流丶1 小时前
【Kafka 实战】如何解决Kafka Topic数量过多带来的性能问题?
java·大数据·kafka·topic
Themberfue1 小时前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式1 小时前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画1 小时前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin