栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

高薪程序员&面试题精讲系列05之String字符串如何截取

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

高薪程序员&面试题精讲系列05之String字符串如何截取

一. 面试题及分析

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()方法,然后对其他方式也可以进行简介即可。本题在面试时出现的频率并不是很高,难度也一般,大家稍微注意即可。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/274850.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号