String源码简析(下)

String源码简析(下):

常用的方法:

1.substring(int beginIndex, int endIndex):得到一个子串.[beginIndex,endIndex)

public String substring(int beginIndex, int endIndex) {
    if (beginIndex < 0) {
        throw new StringIndexOutOfBoundsException(beginIndex);
    }
    if (endIndex > count) {
        throw new StringIndexOutOfBoundsException(endIndex);
    }
    if (beginIndex > endIndex) {
        throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
    }
    return ((beginIndex == 0) && (endIndex == count)) ? this :
        new String(offset + beginIndex, endIndex - beginIndex, value);
    }

2.concat(String str) :将参数字符串添加到该字符串尾部。

 public String concat(String str) {
    int otherLen = str.length();
    if (otherLen == 0) {
        return this;
    }
    char buf[] = new char[count + otherLen];
    getChars(0, count, buf, 0);
    str.getChars(0, otherLen, buf, count);
    return new String(0, count + otherLen, buf);
    }

3.replace(char oldChar, char newChar):用newchar替换字符串中所有的oldchar字符

public String replace(char oldChar, char newChar) {
    if (oldChar != newChar) {
        int len = count;
        int i = -1;
        char[] val = value; /* avoid getfield opcode */
        int off = offset;   /* avoid getfield opcode */

        while (++i < len) {
        if (val[off + i] == oldChar) {
            break;
        }
        }
        if (i < len) {
        char buf[] = new char[len];
        for (int j = 0 ; j < i ; j++) {
            buf[j] = val[off+j];
        }
        while (i < len) {
            char c = val[off + i];
            buf[i] = (c == oldChar) ? newChar : c;
            i++;
        }
        return new String(0, len, buf);
        }
    }
    return this;
    }

4.对该字符串用相应的正则

public boolean matches(String regex) {
        return Pattern.matches(regex, this);
    }

5.contains(CharSequence s):判断字符序列s是否是该字符串的子集(实际调用的是静态的indexOf方法)

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

6.split(String regex, int limit)/split(String regex):用正则对该字符串进行分割,limit表示最多分割的次数

public String[] split(String regex, int limit) {
    return Pattern.compile(regex).split(this, limit);
    }

public String[] split(String regex) {
        return split(regex, 0);
    }

7.toLowerCase(Locale locale):将字符串转成小写的核心代码,但是更常用的是他的重载方法toLowerCase().

public String toLowerCase(Locale locale) {
    if (locale == null) {
        throw new NullPointerException();
        }

        int     firstUpper;

    /* Now check if there are any characters that need to be changed. */
    scan: {
        for (firstUpper = 0 ; firstUpper < count; ) {
        char c = value[offset+firstUpper];
        if ((c >= Character.MIN_HIGH_SURROGATE) &&
            (c <= Character.MAX_HIGH_SURROGATE)) {
            int supplChar = codePointAt(firstUpper);
            if (supplChar != Character.toLowerCase(supplChar)) {
                break scan;
            }
            firstUpper += Character.charCount(supplChar);
        } else {
            if (c != Character.toLowerCase(c)) {
                break scan;
            }
            firstUpper++;
        }
        }
        return this;
    }

        char[]  result = new char[count];
    int     resultOffset = 0;  /* result may grow, so i+resultOffset
                    * is the write location in result */

        /* Just copy the first few lowerCase characters. */
        System.arraycopy(value, offset, result, 0, firstUpper);

    String lang = locale.getLanguage();
    boolean localeDependent =
            (lang == "tr" || lang == "az" || lang == "lt");
        char[] lowerCharArray;
        int lowerChar;
        int srcChar;
        int srcCount;
        for (int i = firstUpper; i < count; i += srcCount) {
        srcChar = (int)value[offset+i];
        if ((char)srcChar >= Character.MIN_HIGH_SURROGATE &&
            (char)srcChar <= Character.MAX_HIGH_SURROGATE) {
        srcChar = codePointAt(i);
        srcCount = Character.charCount(srcChar);
        } else {
            srcCount = 1;
        }
            if (localeDependent || srcChar == '\u03A3') { // GREEK CAPITAL LETTER SIGMA
                lowerChar = ConditionalSpecialCasing.toLowerCaseEx(this, i, locale);
            } else {
                lowerChar = Character.toLowerCase(srcChar);
            }
            if ((lowerChar == Character.ERROR) ||
                (lowerChar >= Character.MIN_SUPPLEMENTARY_CODE_POINT)) {
                if (lowerChar == Character.ERROR) {
                    lowerCharArray =
                        ConditionalSpecialCasing.toLowerCaseCharArray(this, i, locale);
                } else if (srcCount == 2) {
            resultOffset += Character.toChars(lowerChar, result, i + resultOffset) - srcCount;
            continue;
                } else {
            lowerCharArray = Character.toChars(lowerChar);
        }

                /* Grow result if needed */
                int mapLen = lowerCharArray.length;
        if (mapLen > srcCount) {
                    char[] result2 = new char[result.length + mapLen - srcCount];
                    System.arraycopy(result, 0, result2, 0,
                        i + resultOffset);
                    result = result2;
        }
                for (int x=0; x<mapLen; ++x) {
                    result[i+resultOffset+x] = lowerCharArray[x];
                }
                resultOffset += (mapLen - srcCount);
            } else {
                result[i+resultOffset] = (char)lowerChar;
            }
        }
        return new String(0, count+resultOffset, result);
    }

<hr />

public String toLowerCase() {
        return toLowerCase(Locale.getDefault());
    }

8.trim():去掉首尾的空格

    public String trim() {
    int len = count;
    int st = 0;
    int off = offset;      /* avoid getfield opcode */
    char[] val = value;    /* avoid getfield opcode */

    while ((st < len) && (val[off + st] <= ' ')) {
        st++;
    }
    while ((st < len) && (val[off + len - 1] <= ' ')) {
        len--;
    }
    return ((st > 0) || (len < count)) ? substring(st, len) : this;
    }

9.toString():就是他自己

  public String toString() {
    return this;
    }

其他方法:

1.substring(int beginIndex):得到一个子串

public String substring(int beginIndex) {
    return substring(beginIndex, count);
    }

2.subSequence(int beginIndex, int endIndex):得到一个子字符序列

public CharSequence subSequence(int beginIndex, int endIndex) {
        return this.substring(beginIndex, endIndex);
    }

3.toCharArray():将String转成数组,一个特殊版本的getChars

public char[] toCharArray() {
    char result[] = new char[count];
    getChars(0, count, result, 0);
    return result;
    }

注意点:

  • String类中的value是不可变的,所以对一个字符串的增删改操作都会创建一个新的字符串对象,比如:
String a = new String("a");
    for(int i=0;i<1000;i++)
        a += "a";
    //会创建1002个对象,在gc运行之间这些对象都不会回收,这是对内存极大的浪费!!!。

所以记住一个原则:
若一个字符序列会经常被增删改,那么请根据是否并发选择StringBuffer或StringBuild
若一个字符序列很少被增删改,那么请用String

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C++ 标准库中的 `string` 类型是用来表示和操作字符串的类。它在 `<string>` 头文件中定义。 `string` 类使用动态数组来存储和管理字符串。它具有许多方便的成员函数,可以进行字符串的插入、删除、查找、拷贝、连接、子串提取等操作。 `string` 类的码是由 C++ 标准委员会实现,通常是在编译器的标准库中。由于 `string` 是一个模板类,其实现需要一些复杂的底层操作,如内存管理、字符串拷贝、字符大小比较等。 码的具体实现可能因不同编译器而异,但一般会使用指针、指针运算、动态内存分配等技术来实现字符串的存储和操作。可以通过查看 C++ 标准库的实现码来了解具体的细节。 总的来说,`string` 类是 C++ 标准库中用于处理字符串的类,其码实现了字符串的存储和操作功能,常用于编写 C++ 程序中字符串的处理和操作。 ### 回答2: C string是C语言中用于表示字符串的一种数据类型,它是以null字符('\0')结尾的字符数组。在C语言中,字符串常常是用字符数组来表示的,而C string则是对字符数组的一种封装。 在C语言中,字符串常常是以字符数组的形式存储的,例如: char str[10] = "Hello"; 这里str是一个字符数组,它可以存储10个字符,包括字符串"Hello"的5个字符和一个结尾的null字符。 而C string则是对于字符数组的一种封装,它提供了一些用于操作字符串的函数,比如字符串的复制、连接、查找等等。C string码可以在C标准库中找到,一般是以头文件的形式提供给开发者使用。 在C标准库中,有很多与C string相关的函数,比如strcpy()函数用于复制字符串、strcat()函数用于连接字符串、strlen()函数用于获取字符串的长度等等。这些函数都是通过操作字符数组来实现的,对于开发者来说,可以直接调用这些函数来进行字符串操作,无需关心具体的实现细节。 C string码一般会包含在C标准库的码中,开发者可以在编译器的安装目录下找到相应的码文件。这些码文件一般是以.c或者.cpp文件的形式存在,其中定义了与C string相关的各种函数的实现。 总之,C string是C语言中用于表示字符串的一种数据类型,它是通过对字符数组的封装来实现的。开发者可以直接使用C string提供的函数来进行字符串操作,而无需关心具体的实现细节。 C标准库中提供了与C string相关的函数的码,开发者可以查看这些码来了解其具体实现。 ### 回答3: C++中的字符串类 string 是一个非常常用的数据类型,它属于标准库中的一部分,主要用于处理字符串。 在C++的标准库中,string 类被定义在头文件<iostream>或<string>中。通过使用 string 类,我们可以方便地进行字符串的输入、输出、连接、比较等操作。 string 类的内部实现是以动态数组的形式存储字符串的每个字符,并且在需要的时候进行动态内存分配和释放。这也使得 string 类具有了自动管理内存的特性,更加方便和安全。 C++中的 string 类提供了许多常用的成员函数,例如 size()、length()、empty()、clear()等,用于获得字符串的长度、判断字符串是否为空、清空字符串等操作。此外,还可以通过下标访问字符串中的每个字符,对字符串进行遍历和修改。 string 类支持字符串的连接、拷贝和比较等功能。可以使用“+”操作符实现字符串的连接,使用“=”,“==”等操作符进行拷贝和比较。另外,string 类还提供了一些方便的函数,如 append()、substr()等,用于对字符串进行添加和截取等操作。 总的来说,C++中的 string 类简化了字符串的处理过程,提供了丰富的成员函数和操作符,使得字符串的操作更加简单、高效和安全。所以,在C++中如果需要处理字符串,string 类是一个不错的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值