一、前言
在 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)基于引用的比较
一旦我们使用==
运算符来比较两个字符串,实际上是基于引用的比较,换句话说,是比较两个字符串对象的引用是否指向相同的内存地址。
使用
==
运算符意味着会检查两个字符串是否是同一个对象。
在上面的例子中,由于字符串常量池的存在,相同的字符串字面量会被合并,因此str1
和str2
实际上引用相同的字符串对象。
(3)小结
虽然从表面上看,两个字符串用==
和equals()
比较都为true
,但实际上用==
比较两个字符串是否相等时,可能会受到字符串池的影响。
当字符串是通过字符串字面量形式创建时,Java编译器会自动将相同的字符串字面量合并为一个对象,并将其放入字符串池中。
如果我们换一种方式来创建字符串对象,就会发现不同:
在这种情况下,虽然字符串的内容相同,但是由于使用了new
关键字,两个字符串对象分别在堆内存中创建,所以s1
和s2
的引用并不相同,==
比较会返回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 类的基础用法。