一. 面试题及分析
1. 今日面试题
在Java基础知识中,String属于一个常用也常问的知识点,比如有这么一些面试题:
String字符串如何截取子串?
substring有几个重载方法,里面的参数分别代表什么意思?
......
2. 题目分析
这两道面试题,考察的是String字符串相关的知识点,并且侧重于考察String的用法。字符串是我们开发时非常常用的一个知识点,尤其是关于字符串的截取更是常用,所以面试时,面试官就会针对这样常用的技巧进行考察,以此来判断你是否进行过开发。
接下来请跟着 一一哥 来学习一下这些API吧。
二. 参考答案
字符串截取相关API
开发时,我们要经常对String字符串进行截取,其中与字符串截取相关的API,最直接的肯定是substring()这个方法,如下图所示:
我们还可以利用split()方法来截取字符串,如下图所示:
另外我们还可以通过其他API类来实现字符串的截取,比如StringTokenizer和Pattern正则表达式。
所以可以实现字符串截取操作的API有如下:
substring()方法
split()方法
StringTokenizer类
Pattern正则表达式
三. substring()方法详解
1. substring()方法介绍
String类中substring()有2个重载方法,分别携带了1个参数和2个参数,如下图所示:
我先来给大家讲解一下substring()方法的作用。
1.1 substring(int beginIndex)
作用:该方法用来截取得到一个新的String字符串的子串,该方法是从字符串的首字母开始,截取掉beginIndex个字符,然后将剩余的字符串作为子串返回。
参数:beginIndex - 开始处的索引(包括),
返回值:指定的子串
异常:如果 beginIndex 为负或大于此 String 的长度,则抛出IndexOutOfBoundsException异常。
1.2 substring(int beginIndex,int endIndex)
作用:该方法用来截取得到一个新的String字符串的子串,该子串从指定的 beginIndex 处开始,到指定的 endIndex-1 处结束。
参数:beginIndex 开始处的索引(包括)
endindex 结尾处索引(不包括)
返回值:指定的子串
异常:如果 beginIndex 为负,或length大于字符串长度,则抛出IndexOutOfBoundsException。
2. 代码示例
String str="Hello YiYiGe!";
String s1 = str.substring(2);
System.out.println("s1="+s1);//llo YiYiGe!
String s2 = str.substring(2,6);
System.out.println("s2="+s2);//llo
3. 源码分析
3.1 substring(int beginIndex)源码
public String substring(int beginIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
int subLen = value.length - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return (beginIndex == 0) ? this : new String(value, beginIndex, subLen);
}
从substring(int beginIndex)的源码中,我们可以看出:
如果beginIndex<0,则会抛出StringIndexOutOfBoundsException异常;
如果subLen<0,则会抛出StringIndexOutOfBoundsException异常;
接着判断beginIndex是否=0,如果为0则直接返回当前字符串对象;否则返回一个新的截取后的子串。
3.2 substring(int beginIndex,int endIndex)源码
public String substring(int beginIndex, int endIndex) {
if (beginIndex < 0) {
throw new StringIndexOutOfBoundsException(beginIndex);
}
if (endIndex > value.length) {
throw new StringIndexOutOfBoundsException(endIndex);
}
int subLen = endIndex - beginIndex;
if (subLen < 0) {
throw new StringIndexOutOfBoundsException(subLen);
}
return ((beginIndex == 0) && (endIndex == value.length)) ? this
: new String(value, beginIndex, subLen);
}
从substring(int beginIndex,int endIndex)的源码中,我们可以看出:
如果beginIndex<0,则会抛出StringIndexOutOfBoundsException异常;
如果endIndex>字符串长度,也会抛出StringIndexOutOfBoundsException异常;
如果subLen<0,则会抛出StringIndexOutOfBoundsException异常;
接着判断beginIndex是否=0,且endIndex是否和数组长度相等,如果为true则直接返回当前字符串对象;否则返回一个新的截取后的子串。
四. split()方法
我们还可以使用另一个split()方法来间接达到字符串截取的效果。
1. split()方法介绍
String类中split()有2个重载方法,分别携带了1个参数和2个参数,如下图所示:
接下来我们看看split()方法的作用。
split(regex,[limit])
作用:该方法用来将一个字符串分割为子字符串,然后会将结果作为字符串数组返回。
参数1:regex - 必选项.表示字符串的分隔符 或 一个 正则表达式 ,它标识了分隔字符串时使用的是一个还是多个字符。如果忽略该选项,会返回包含整个字符串的单一元素数组。因为“ . ” 在正则表达式中有特殊的含义,因此我们使用的时候必须进行转义。
参数2:limit - 可选项。该值用来限制返回数组中的元素个数。
返回值:指定的子串数组。其中separator 不会作为任何数组元素的部分返回。
2. 代码示例
String str = "Hello,yi,ge";
String[] s = str.split(",");
for (String string : s) {
System.out.println(string);
}
五. StringTokenizer类
我们还可以使用StringTokenizer类来实现字符串的截取效果。
1. StringTokenizer类介绍
StringTokenizer类中有众多方法,如下图所示:
接下来我们看看StringTokenizer的作用。
StringTokenizer常用方法:
- 1. int countTokens():返回nextToken方法被调用的次数。
- 2. boolean hasMoreTokens():返回是否还有分隔符。
- 3. boolean hasMoreElements():判断枚举 (Enumeration) 对象中是否还有数据。
- 4. String nextToken():返回从当前位置到下一个分隔符的字符串。
- 5. Object nextElement():返回枚举 (Enumeration) 对象的下一个元素。
- 6. String nextToken(String delim):与 4 类似,以指定的分隔符返回结果。
2. 代码示例
String str = "Hello,yi,ge";
StringTokenizer stringTokenizer = new StringTokenizer(str, ",");
while (stringTokenizer.hasMoreTokens()) {
System.out.println(stringTokenizer.nextToken());
}
六. Pattern正则表达式
我们也还可以使用Pattern类,结合正则表达式来实现字符串的截取效果。
1. Pattern类介绍
Pattern类中有一个比较重要的compile()方法,如下图所示:
Pattern类的构造器是私有的,不能通过new创建Pattern对象,可以通过Pattern调用静态方法compile返回Pattern实例。compile中有2个核心参数:
regex:正则表达式;
flag:是一个标记参数,有好几个值,Pattern.CANON_EQ,Pattern.CASE_INSENSITIVE,Pattern.COMMENTS,Pattern.DOTALL,Pattern.MULTILINE,Pattern.UNICODE_CASE,Pattern.UNIX_LINES等。
2. 代码示例
String str = "Hello,yi,ge";
Pattern p = Pattern.compile(",");
String[] s = p.split(str);
for (String string : s) {
System.out.println(string);
}
七. 结论
这样我就给大家介绍了4种截取String字符串的方式,并结合代码给各位做了讲解实现。最后我们再回顾一下今天面试题,即“String字符串如何截取子串”,方式有4种:
substring()方法
split()方法
StringTokenizer类
Pattern正则表达式
我们在面试时,重点介绍substring()方法,然后对其他方式也可以进行简介即可。本题在面试时出现的频率并不是很高,难度也一般,大家稍微注意即可。



