String常用方法及部分源码分析

1.int length();

语法:字符串变量名.length();

返回值为 int 类型。得到一个字符串的字符个数(中、英、空格、转义字符皆为字符,计入长度)

/** The String is used char value[] **/
public int length() {
        return value.length;
    }
  /** The value is used for character storage. */
private final char value[];
2.char charAt(int index);

语法 :字符串名.charAt(值);

返回值为 char 类型。从字符串中取出指定位置的字符

public char charAt(int index) {
        if ((index < 0) || (index >= value.length)) {
            throw new StringIndexOutOfBoundsException(index);
        }
    //If index right return value[index]
        return value[index];
    }
3.char toCharArray();

语法 :字符串名.toCharArray();

返回值为 char 数组类型。将字符串变成一个字符数组

public char[] toCharArray() {
        // Cannot use Arrays.copyOf because of class initialization order issues
        char result[] = new char[value.length];
        System.arraycopy(value, 0, result, 0, value.length);
        return result;

思考:为什么要拷贝一个新数组返回?直接返回value不就得了?

public char[] toCharArray() {
        return value;
    }

原因: 因为 Java 中数组实质上是 Array 类的实例,如果直接返回 value,那么传递的是value[]数组的地址,一旦你修改了 toCharArray() 返回值里某个位置上的字符,那个 String 实例的值(即 value )也会跟着变动,会破坏String类型设计的初衷。

System.arraycopy()代码解释: 复制指定的源数组的数组,在指定的位置开始,到目标数组的指定位置

public static void arraycopy(Object src, int srcPos, Object dest, int destPos, int length)

Object src : 原数组 int srcPos : 从原数据的指定位置开始复制

Object dest : 目标数组   int destPos : 目标数组的开始起始位置

int length : 要copy的数组的长度

4.int indexOf(…)
intindexOf(int ch)返回指定字符第一次出现的字符串内的索引。
intindexOf(int ch, int fromIndex)返回指定字符第一次出现的字符串内的索引,以指定的索引开始搜索。
intindexOf(String str)返回指定子字符串第一次出现的字符串内的索引。
intindexOf(String str, int fromIndex)返回指定子串的第一次出现的字符串中的索引,从指定的索引开始。

语法 :字符串名.indexOf(“字符”);

字符串名.indexOf(“字符”,值);

查找一个指定的字符串是否存在,返回的是字符串的位置,如果不存在,则返回-1 。

public int indexOf(String str) {   
    return indexOf(str, 0);
}
public int indexOf(int ch, int fromIndex) {
        final int max = value.length;
        if (fromIndex < 0) {
            fromIndex = 0;
        } else if (fromIndex >= max) {
            // Note: fromIndex might be near -1>>>1.
            return -1;
        }

        if (ch < Character.MIN_SUPPLEMENTARY_CODE_POINT) {
            // handle most cases here (ch is a BMP code point or a
            // negative value (invalid code point))
            final char[] value = this.value;
            for (int i = fromIndex; i < max; i++) {
                if (value[i] == ch) {
                    return i;
                }
            }
            return -1;
        } else {
            return indexOfSupplementary(ch, fromIndex);
        }
    }

    /**
     * Handles (rare) calls of indexOf with a supplementary character.
     */
    private int indexOfSupplementary(int ch, int fromIndex) {
        if (Character.isValidCodePoint(ch)) {
            final char[] value = this.value;
            final char hi = Character.highSurrogate(ch);
            final char lo = Character.lowSurrogate(ch);
            final int max = value.length - 1;
            for (int i = fromIndex; i < max; i++) {
                if (value[i] == hi && value[i + 1] == lo) {
                    return i;
                }
            }
        }
        return -1;
    }
5.int lastIndexOf()
intlastIndexOf(int ch)返回指定字符的最后一次出现的字符串中的索引。
intlastIndexOf(int ch, int fromIndex)返回指定字符的最后一次出现的字符串中的索引,从指定的索引开始向后搜索。
intlastIndexOf(String str)返回指定子字符串最后一次出现的字符串中的索引。
intlastIndexOf(String str, int fromIndex)返回指定子字符串的最后一次出现的字符串中的索引,从指定索引开始向后搜索
6.toUpperCase(); toLowerCase();

字符串大小写的转换

**实现原理:**在ASCII编码表中,A-Z 和 a-z 的 ASCII 编码的十进制刚好相差32,

实现思路就是将大写的转成十进制编码,再转换成小写字母的十进制编码,最后得到小写字母。

7.String[] split(“字符”)

根据给定的正则表达式的匹配来拆分此字符串。返回的是一个新的String数组。

String str = "boo:and:foo";
String[] arr1 = str.split(":");
String[] arr2 = str.split("o");
运行结果:
  arr1  //{ "boo", "and", "foo" }
  arr2  //{ "b", "", ":and:f" }
8.String trim();

去掉字符串左右空格。

9.replace(char oldChar,char newChar);
StringreplaceAll(String regex,String replacement)将某个内容全部替换成指定内容
StringrepalceFirst(String regex,String replacement)将第一次出现的某个内容替换成指定的内容新字符替换旧字符,也可以达到去空格的效果一种。
10.String substring(int beginIndex,int endIndex)

截取字符串从开始位置到结束位置,传入的是int。

11.boolean equalsIgnoreCase(String)

忽略大小写的比较两个字符串的值是否一模一样,返回一个布尔值 。

12.boolean contains(String str)

判断一个字符串里面是否包含指定的内容,返回一个布尔值 。

public boolean contains(CharSequence s) {    
    return indexOf(s.toString()) > -1;
}

原理:调用的是indexOf()方法去变遍历value[]是否有这个子串,如果没有indexOf()方法返回的是-1,如果有返回的是字符串所在数组下标的位置。

13.boolean startsWith(String prefix)

测试此字符串是否以指定的前缀开始。返回一个布尔值 。

boolean startsWith(String prefix, int toffset)

测试在指定索引处开始的此字符串的子字符串,是否以指定的前缀开头。

public boolean startsWith(String prefix, int toffset) {
        char ta[] = value;//String定义的字符串
        int to = toffset;//传入的索引下标
        char pa[] = prefix.value;//传入的前缀字符串
        int po = 0;//前指针
        int pc = prefix.value.length;//后指针
        // Note: toffset might be near -1>>>1.
        if ((toffset < 0) || (toffset > value.length - pc)) {//如果越界
            return false;
        }
        while (--pc >= 0) {//后指针--
            if (ta[to++] != pa[po++]) {//如果ta(value数组)的索引下标(传入的toffset开始++)不等于pa数组(传入的字字符串),(索引从0开始)++,返回false
                return false;
            }
        }
        return true;
    }
14.boolean endsWith(String suffix)

测试此字符串是否以指定的后缀结束。返回一个布尔值 。

15. int compareTo(String anotherString)

返回值是整型,它是先比较对应字符的大小(ASCII码顺序),如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值,如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有一方结束。

  • 如果参数字符串等于此字符串,则返回值 0;
  • 如果此字符串小于字符串参数,则返回一个小于 0 的值;
  • 如果此字符串大于字符串参数,则返回一个大于 0 的值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值