这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
字符串中字符的操作
String 类提供了许多方法来检测字符串的内容,查找字符串中的字符或子串,改变大小写,以及其他的一些任务。
通过下标来获取字符和子串
通过CharAt() 访问器方法能获取特定下标处的字符。第一个字符的下标是0,最后一个字符的下标是length()-1。比如,下例获取字符串中下标为9的字符:
String anotherPalindrome = "Niagara. O roar again!";
char aChar = anotherPalindrome.charAt(9);
索引从下标0开始,所以下标为9的字符是’O’,如下图所示:
如果要从字符串中获取多于一个的连续字符,可以使用substring 方法。substring 方法有2个版本,如下图所示:
方法 | 描述 |
---|---|
String substring(int beginIndex, int endIndex) | 返回包含字符串子串的新字符串,子串从beginIndex开始,到endIndex-1结束 |
String substring(int beginIndex) | 返回包含字符串子串的新字符串,子串从beginIndex开始,一直到原字符串的结尾 |
下面的代码从回文中获取从下标11,到下标15(不包含)子串:
String anotherPalindrome = "Niagara. O roar again!";
String roar = anotherPalindrome.substring(11, 15);
其他操作字符串的方法
这是操作字符串的其他方法:
方法 | 描述 |
---|---|
String[] split(String regex) String[] split(String regex, int limit) | 搜索由string参数(包含正则表达式)指定的匹配项,并将该字符串分割为字符串数组。可选整数参数指定返回数组的最大大小。正则表达式包含在“正则表达式”一节中。 |
CharSequence subSequence(int beginIndex, int endIndex) | 返回从beginIndex开始到endIndex-1结尾的字符序列 |
String trim() | 返回原字符串的拷贝同时移除前导和后缀中的空白字符 |
String toLowerCase() String toUpperCase() | 返回被转换成全部小写或全部大写的字符串,如果转换没有发生,则返回原字符串 |
搜索字符串中的字符和子串
还有一些方法用来查找字符串中的字符和子串。String 类提供了访问器方法返回字符串中特定字符或子串的位置:indexOf() 和 lastIndexOf()。*indexOf()*按照从前往后顺序搜寻,lastIndexOf() 按照从后往前顺序搜寻。如果字符或子串不存在,它们都返回-1。
String 也提供了一个搜索方法:contain ,当字符串中包含特定字符序列时返回 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 |
将字符和子字符串替换为字符串
String 类 有一些方法能把字符或子串插入到字符串中。通常,不需要这样来做:可以通过从字符串中删除的子字符串与要插入的子字符串连接起来创建一个新字符串。
String 类有4个方法来替换找到的字符或子串:
方法 | 描述 |
---|---|
String replace(char oldChar, char newChar) | 返回一个用newChar来替换oldChar的字符串 |
String replace(CharSequence target, CharSequence replacement) | 用replacement替换每个匹配目标target的子串 |
String replaceAll(String regex, String replacement) | 用replacement替换每个用正则表达式匹配的子串 |
String replaceFirst(String regex, String replacement) | 用replacement替换第一个用正则表达式匹配的子串 |
示例
下面的示例 演示了使用lastIndexOf() 和 substring() 来分割文件名:
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
如下图所示,扩展名使用 lastIndexOf 定位文件名中 . 最后一次出现的位置。substring 使用 lastIndexOf的返回值来提取文件扩展名 — 即从句号开始的子串。该代码假设文件名中包含句号;如果文件名中不包含句号,lastIndexOf 返回 -1,substring 方法抛出StringIndexOutOfBoundsException异常。
请注意扩展名使用了dot + 1 作为 substring 方法的参数。如果句号是字符串的最后一个字符,那么dot + 1 就和字符串的长度相等,字符串的长度要比最大的字符下标索引大(因为下标是从0开始)。对substring来说,这是一个合法的参数,因为该方法接受与之相等但不大于字符串长度的下标索引,并把它解释为字符串的结尾。