String类有许多用于检查字符串的内容,在字符串中发现字符或字符串,改变字符串和其他任务的方法。

通过索引获取字符和子字符串

您可以通过调用charAt()访问器方法(accessor method)来获取字符串中特定索引处的字符。第一个字符的索引为0,而最后一个字符的索引为length()-1。例如,以下代码获取字符串中索引9处的字符:

  1. String anotherPalindrome = "Niagara. O roar again!";
  2. char aChar = anotherPalindrome.charAt(9);

索引从0开始,因此索引9处的字符为“ O”,如下图所示:
操纵字符串中的字符 - 图1
如果要从字符串中获取多个连续字符,则可以使用substring方法。substring方法有两个版本,如下表所示:
String类中的substring方法

方法 描述
String substring(int beginIndex, int endIndex) 返回一个新字符串,新字符串是原字符串的子字符串。子字符串从beginIndex指定的字符串开始,并扩展到索引endIndex - 1的字符。
String substring(int beginIndex) 返回一个新字符串,新字符串是原字符串的子字符串。整数参数指定第一个字符的索引。在这里,返回的子字符串扩展到原字符串的末尾。

以下代码从Niagara回文中获取从索引11延伸到但不包括索引15(即“roar”)的子字符串:

  1. String anotherPalindrome = "Niagara. O roar again!";
  2. String roar = anotherPalindrome.substring(11, 15);

操纵字符串中的字符 - 图2

其他处理字符串的方法

这是其他几种处理字符串的String方法:
String类中用于处理字符串的其他方法

方法 描述
String[] split(String regex)

String[] split(String regex, int limit) | 搜索由字符串参数(包含正则表达式)指定的匹配项,并将该字符串相应地拆分为字符串数组。可选的整型参数指定返回数组的最大大小。在标题为“正则表达式”的课程中介绍了正则表达式。 | | CharSequence subSequence(int beginIndex, int endIndex) | 返回从索引beginIndex直到endIndex-1 的新字符序列。 | | String trim() | 返回此字符串的副本,其中删除了前导和尾随空白。 | | String toLowerCase()<br /> String toUpperCase() | 返回此字符串的副本,转换为小写或大写。如果不需要进行转换,则这些方法将返回原字符串。 |

在字符串中搜索字符和子字符串

这是在字符串中查找字符或子字符串的其他一些String方法。String类提供了返回字符串内的一个特定的字符或字符串的位置的访问器方法:indexOf()和lastIndexOf()。indexOf()方法从字符串的开头向前搜索,而lastIndexOf()方法从字符串的结尾向后搜索(写字从左往右,即为从后向前)。如果找不到字符或字符串,indexOf()和lastIndexOf()返回-1。
String类还提供了一个搜索方法contains,如果字符串中包含特定字符序列,则返回true。当您只需要知道字符串包含一个字符序列,但是精确的位置并不重要时,请使用此方法。
下表描述了各种字符串搜索方法。
String类的搜索方法

方法 描述
`int indexOf(int ch)

int lastIndexOf(int ch)| 返回指定字符的第一个(最后)出现的索引。 | |int indexOf(int ch, int fromIndex)
int lastIndexOf(int ch, int fromIndex)| 返回指定字符的第一个(最后)出现的索引,从指定的索引向前(向后)搜索。 | |int indexOf(String str)
int lastIndexOf(String str)| 返回指定子字符串的第一个(最后)出现的索引。 | |int indexOf(String str, int fromIndex)
int lastIndexOf(String str, int fromIndex)| 返回指定子字符串的第一个(最后)出现的索引,从指定的索引向前(向后)搜索。 | |boolean contains(CharSequence s)` | 如果字符串包含指定的字符序列,则返回true。 |


注意: CharSequence是由String类实现的接口。因此,可以将字符串用作contains()方法的参数。


将字符和子字符串替换为字符串

String类有非常少的插入字符或字符串转换成字符串的方法。通常,不需要它们:您可以通过串联从字符串中删除(removed)的子字符串和要插入的子字符串来创建新字符串。
但是,String类确实有四种方法来替换(replacing)找到的字符或子字符串。他们是:
String类中处理字符串的方法

方法 描述
String replace(char oldChar, char newChar) 返回一个新字符串,新字符串是用newChar替换原字符串中所有出现的oldChar的结果。
String replace(CharSequence target, CharSequence replacement) 用指定的字面量替换序列替换原字符串中与字面量目标序列匹配的每个子字符串。
String replaceAll(String regex, String replacement) 用给定的替换项替换该字符串中与给定的正则表达式匹配的每个子字符串。
String replaceFirst(String regex, String replacement) 用给定的替换项替换与给定的正则表达式匹配的此字符串的第一个子字符串。

一个例子

下面的类 Filename说明了如何使用lastIndexOf()和substring()隔离文件名的不同部分。


注意:Filename类中的方法不进行任何错误检查,并假定其参数包含完整的目录路径和带扩展名的文件名。如果这些方法是生产代码,则它们将验证其参数是否正确构造。


  1. public class Filename {
  2. private String fullPath;
  3. private char pathSeparator,
  4. extensionSeparator;
  5. public Filename(String str, char sep, char ext) {
  6. fullPath = str;
  7. pathSeparator = sep;
  8. extensionSeparator = ext;
  9. }
  10. public String extension() {
  11. int dot = fullPath.lastIndexOf(extensionSeparator);
  12. return fullPath.substring(dot + 1);
  13. }
  14. // gets filename without extension
  15. public String filename() {
  16. int dot = fullPath.lastIndexOf(extensionSeparator);
  17. int sep = fullPath.lastIndexOf(pathSeparator);
  18. return fullPath.substring(sep + 1, dot);
  19. }
  20. public String path() {
  21. int sep = fullPath.lastIndexOf(pathSeparator);
  22. return fullPath.substring(0, sep);
  23. }
  24. }

这是一个程序 FilenameDemo,它构造了一个Filename对象并调用其所有方法:

  1. public class FilenameDemo {
  2. public static void main(String[] args) {
  3. final String FPATH = "/home/user/index.html";
  4. Filename myHomePage = new Filename(FPATH, '/', '.');
  5. System.out.println("Extension = " + myHomePage.extension());
  6. System.out.println("Filename = " + myHomePage.filename());
  7. System.out.println("Path = " + myHomePage.path());
  8. }
  9. }

这是程序的输出:

  1. Extension = html
  2. Filename = index
  3. Path = /home/user

如下图所示,我们的extension方法使用lastIndexOf在文件名中找到句点(.)的最后一次出现位置。然后substring使用lastIndexOf的返回值提取文件扩展名-即从句点到字符串结尾的子字符串。此代码假定文件名中包含句点;如果文件名没有句点,则lastIndexOf返回-1,并且substring方法将抛出StringIndexOutOfBoundsException。
操纵字符串中的字符 - 图3
另外,请注意,extension方法使用dot + 1作为substring的参数。如果句点字符(.)是字符串的最后一个字符,dot + 1则等于字符串的长度,该长度比字符串的最大索引大一个(因为索引从0开始)。这是合法的说法,因为substring方法接受的索引等于但不大于字符串的长度,并将其解释为“字符串的末尾”。