Java 教程是为 JDK 8 编写的。本页中描述的示例和实践未利用在后续版本中引入的改进。
String
类有许多方法可用于检查字符串的内容,查找字符串中的字符或获取子字符串,更改大小写以及其他任务。
你可以通过调用 charAt()
访问器方法获取字符串中特定索引处的字符。第一个字符的索引是 0,而最后一个字符的索引是 length()-1
。例如,以下代码获取字符串中索引 9 处的字符:
String anotherPalindrome = "Niagara. O roar again!"; char aChar = anotherPalindrome.charAt(9);
索引从 0 开始,因此索引 9 处的字符为 'O' ,如下图所示:
如果要从字符串中获取多个连续字符,可以使用 substring
方法。substring
方法有两个版本,如下表所示:
方法 | 描述 |
---|---|
String substring(int beginIndex, int endIndex) |
返回一个新字符串,该字符串是此字符串的子字符串。子字符串从指定的 beginIndex 开始,并扩展到索引 endIndex - 1 处的字符。 |
String substring(int beginIndex) |
返回一个新字符串,该字符串是此字符串的子字符串。integer 参数指定第一个字符的索引。这里,返回的子字符串扩展到原始字符串的末尾。 |
以下代码从 Niagara 回文中获取从索引 11 延伸到但不包括索引 15 的子字符串,这是 "roar" 一词:
String anotherPalindrome = "Niagara. O roar again!"; String roar = anotherPalindrome.substring(11, 15);
以下是几个用于操作字符串的 String
方法:
方法 | 描述 |
---|---|
String[] split(String regex) String[] split(String regex, int limit) |
搜索字符串参数(包含正则表达式)指定的匹配项,并相应地将此字符串拆分为字符串数组。可选的整数参数指定返回数组的最大大小。正则表达式在标题为 "正则表达式" 的课程中介绍。 |
CharSequence subSequence(int beginIndex, int endIndex) |
返回从 beginIndex 索引到 endIndex - 1 构造的新字符序列。 |
String trim() |
返回此字符串的副本,其中移除了前导和尾随空格。 |
String toLowerCase() |
返回转换为小写或大写的此字符串的副本。如果不需要转换,则这些方法返回原始字符串。 |
以下是一些用于查找字符串中的字符或子字符串的其他 String
方法。String
类提供了访问器方法,这些方法返回特定字符或子字符串在字符串中的位置:indexOf()
和 lastIndexOf()
。indexOf()
方法从字符串的开头向前搜索,lastIndexOf()
方法从字符串的末尾向后搜索。如果未找到字符或子字符串,indexOf()
和 lastIndexOf()
将返回 -1。
String
类还提供了一个搜索方法 contains
,如果字符串包含特定字符序列,则返回 true。当你只需知道字符串是否包含字符序列,但精确位置并不重要时,请使用此方法。
下表描述了各种字符串搜索方法。
方法 | 描述 |
---|---|
int indexOf(int ch) |
返回指定字符的第一个(最后一个)匹配项的索引。 |
int indexOf(int ch, int fromIndex) |
返回指定字符的第一个(最后一个)匹配项的索引,从指定的索引向前(向后)搜索。 |
int indexOf(String str) |
返回指定子字符串的第一个(最后一个)匹配项的索引。 |
int indexOf(String str, int fromIndex) |
返回指定子字符串的第一个(最后一个)匹配项的索引,从指定的索引向前(向后)搜索。 |
boolean contains(CharSequence s) |
如果字符串包含指定的字符序列,则返回 true。 |
CharSequence
是由 String
类实现的接口。因此,你可以使用字符串作为 contains()
方法的参数。
String
类只有很少的方法可以将字符或子字符串插入到字符串中。通常,它们不是必需的:你可以通过连接要 移除 的源字符的子字符串和要插入的子字符串,来创建一个新字符串。
但是,String
类有 replacing (替换) 找到的字符或子字符串的四种方法。他们是:
方法 | 描述 |
---|---|
String replace(char oldChar, char newChar) |
返回一个新字符串,将此字符串中所有的 oldChar 替换为 newChar 。 |
String replace(CharSequence target, CharSequence replacement) |
将此字符串中与 target 匹配的每个子字符串替换为指定的 replacement 序列。 |
String replaceAll(String regex, String replacement) |
将此字符串中与给定正则表达式匹配的的每一个子字符串替换为给定的 replacement。 |
String replaceFirst(String regex, String replacement) |
将此字符串中与给定正则表达式匹配的的第一个子字符串替换为给定的 replacement。 |
以下类 Filename
说明了使用 lastIndexOf()
和 substring()
来隔离不同部分的文件名。
Filename
类中的方法不进行任何错误检查,并假设其参数包含完整目录路径和带扩展名的文件名。如果这些方法是生产代码,他们将验证他们的参数是否正确构造。
public class Filename { private String fullPath; private char pathSeparator, extensionSeparator; public Filename(String str, char sep, char ext) { fullPath = str; pathSeparator = sep; extensionSeparator = ext; } public String extension() { int dot = fullPath.lastIndexOf(extensionSeparator); return fullPath.substring(dot + 1); } // gets filename without extension public String filename() { int dot = fullPath.lastIndexOf(extensionSeparator); int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(sep + 1, dot); } public String path() { int sep = fullPath.lastIndexOf(pathSeparator); return fullPath.substring(0, sep); } }
这是一个程序 FilenameDemo
,它构造一个 Filename
对象并调用其所有方法:
public class FilenameDemo { public static void main(String[] args) { final String FPATH = "/home/user/index.html"; Filename myHomePage = new Filename(FPATH, '/', '.'); System.out.println("Extension = " + myHomePage.extension()); System.out.println("Filename = " + myHomePage.filename()); System.out.println("Path = " + myHomePage.path()); } }
下面是程序的输出:
Extension = html Filename = index Path = /home/user
如下图所示,我们的 extension
方法使用 lastIndexOf
来查找文件名中最后一个匹配项的句点(.)。然后 substring
使用 lastIndexOf
的返回值来提取文件扩展名 也就是说,从字符串的句点到结尾的子字符串。此代码假定文件名中包含句点;如果文件名没有句点,则 lastIndexOf
返回-1,并且 substring 方法抛出 StringIndexOutOfBoundsException
。
另请注意,extension
方法使用 dot + 1
作为 substring
的参数。如果句点字符(.)是字符串的最后一个字符,则 dot + 1
等于字符串的长度,该字符串大于字符串中的最大索引(因为索引从 0 开始)。这是 substring
的合法参数,因为该方法接受的索引等于但不大于字符串的长度,并将其解释为 "字符串的结尾"。