此教程适用于JDK 8。本页中描述的示例和实践不利用后续版本中引入的改进,并且可能使用不再可用的技术。
有关Java SE 9及其后续版本中更新的语言功能的摘要,请参阅Java语言变化。
有关所有JDK版本的新功能、增强功能以及已删除或不推荐使用的选项的信息,请参阅JDK发布说明。
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) |
返回一个新字符串,该字符串是此字符串的子字符串。整数参数指定第一个字符的索引。在这里,返回的子字符串延伸到原始字符串的末尾。 |
以下代码从Niagara回文字符串中获取从索引11到索引15之前(不包括索引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类确实有四个用于替换已找到的字符或子字符串的方法。它们是:
方法 | 描述 |
---|---|
String replace(char oldChar, char newChar) |
返回一个新字符串,其中替换了此字符串中所有出现的旧字符为新字符。 |
String replace(CharSequence target, CharSequence replacement) |
用指定的替换序列替换此字符串中与目标序列匹配的每个子字符串。 |
String replaceAll(String regex, String replacement) |
用给定的替换字符串替换此字符串中与给定正则表达式匹配的每个子字符串。 |
String replaceFirst(String regex, String 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); } // 获取没有扩展名的文件名 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
等于字符串的长度,这比字符串的最大索引大1(因为索引从0开始)。这是substring
的合法参数,因为该方法接受一个等于但不大于字符串长度的索引,并将其解释为“字符串的末尾”。