关于Java中String截取时位置的问题

在Java中经常会碰到字符串截取的操作,比如获取文件名的后缀。
最主要使用的是indexOf和subString()两个函数,但是我经常将两个函数中的index弄混,用到的时候就去网上查看一下答案,过一段时间又忘记了。
所以在这里查看一下他们的实现方式,这样记忆会更深刻。

indexOf()

这个函数比较简单,返回的就是第一个出现的字符串的索引(这里的索引指的是从0开始计数的),如果没有出现就返回-1,这个很好理解,没什么问题。

subString()

这个函数中有两个参数,一个是beginIndex,一个是endIndex。
API文档也很清楚的给出了答案,这两个参数都表示的是索引,而且beginIndex指向的字符包含,endIndex指向的字符不包含。
当然他们的底层实现是Arrays.copyOfRange函数,说明截取的字符串占用的是一段新分配的内存。

/**
 * Returns a string that is a substring of this string. The
 * substring begins at the specified {@code beginIndex} and
 * extends to the character at index {@code endIndex - 1}.
 * Thus the length of the substring is {@code endIndex-beginIndex}.
 * <p>
 * Examples:
 * <blockquote><pre>
 * "hamburger".substring(4, 8) returns "urge"
 * "smiles".substring(1, 5) returns "mile"
 * </pre></blockquote>
 *
 * @param      beginIndex   the beginning index, inclusive.
 * @param      endIndex     the ending index, exclusive.
 * @return     the specified substring.
 * @exception  IndexOutOfBoundsException  if the
 *             {@code beginIndex} is negative, or
 *             {@code endIndex} is larger than the length of
 *             this {@code String} object, or
 *             {@code beginIndex} is larger than
 *             {@code 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);
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注