java中String类详解

  • 一、概述
  • 二、字段值
  • 三、构造方法
  • 四、常用方法
  • 五、StringBuffer、StringBuilder类
  • 1.StringBuffer
  • 2.StringBuilder


一、概述

  • java中String是一个final修饰的类,所以它不能被继承,代表不可变的字符序列;
  • 所有字符串都是String的实例;
  • String是常量,用双引号引来表示,它的值在创建后不可改变。
public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
	private final byte[] value;//内部存储数据的字符数组
	private final byte coder;//用于对中的字节进行编码的编码的标识符
	private int hash; // Default to 0,缓存字符串的hash值
...
}

二、字段值

static Comparator CASE_INSENSITIVE_ORDER
由compareToIgnoreCase订购String对象的比较compareToIgnoreCase 。 该比较器是可序列化的。

三、构造方法

  1. public String():初始化新创建的String对象,使其表示空字符序列。 请注意,由于字符串是不可变的,因此不必使用此构造函数
public String(){
	this.value = "".value;
    this.coder = "".coder;
}
  1. public String(String original):初始化新创建的String对象,使其表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。
public String(String original) {
        this.value = original.value;
        this.coder = original.coder;
        this.hash = original.hash;
    }
  1. public String(char[] value):分配新的 String ,使其表示当前包含在字符数组参数中的字符序列。根据重载的构造方法来创建。
public String(char value[]) {
        this(value, 0, value.length, null);//调用自身的构造方法
    }
    //构造器内调用的构造方法
     String(char[] value, int off, int len, Void sig) {
        if (len == 0) {
            this.value = "".value;
            this.coder = "".coder;
            return;
        }
        if (COMPACT_STRINGS) {
            byte[] val = StringUTF16.compress(value, off, len);
            if (val != null) {
                this.value = val;
                this.coder = LATIN1;
                return;
            }
        }
        this.coder = UTF16;
        this.value = StringUTF16.toBytes(value, off, len);
    }
  • Void类 是一个不可实例化的占位符类,用于保存对表示Java关键字的{@code Class}对象的引用
  1. String(char[] value, int offset, int count):分配新的String,使其表示参数字符数组的子数组的字符序列。
    value - 作为字符源的数组
    offset - 初始偏移量
    count - 长度
public String(char value[], int offset, int count) {
        this(value, offset, count, rangeCheck(value, offset, count));
    }
    //检查数组的区间合理,如果合理就返回null
    private static Void rangeCheck(char[] value, int offset, int count) {
        checkBoundsOffCount(offset, count, value.length);
        return null;
    }
    //检查count长度越界问题
  static void checkBoundsOffCount(int offset, int count, int length) {
        if (offset < 0 || count < 0 || offset > length - count) {
            throw new StringIndexOutOfBoundsException(
                "offset " + offset + ", count " + count + ", length " + length);
        }
    }
  1. String(StringBuffer buffer):创建包含当前包含在字符串缓冲区buffer参数中的字符序列。
  2. String(StringBuilder builder):创建包含当前包含在builder参数中的字符序列。
  3. String(byte[] bytes):使用平台默认字符集解码字节数组bytes构造String
  4. String(byte[] bytes,String charsetName),String(byte[] bytes, int offset, int length, String charsetName):使用指定的字符集解码charsetName来解码字节并构造成String;
  5. String(byte[] bytes, Charset charset):构造一个新的String由指定用指定的字节的数组解码charset 。

四、常用方法

  1. charAt(int index):返回指定索引位置的char值
  2. length():返回字符串长度
  3. isEmpty():判断是否为空串
  4. toLowerCase():转为小写
  5. toUpperCase():转为大写
  6. trim() :返回字符串副本,忽略前导和尾部空白
  7. equals(Object obj):比较字符串内容
  8. equalsIgnoreCase(String otherString):与equals类似,但忽略大小写
  9. concat(String str):与+ 等同
  10. int compareTo(String otherString):按字典顺序比较两个字符串大小
  11. subString(int beginIndex):返回新的字符串,是对原字符串从beginIndex开始到最后的截取
  12. subString(int beginIndex,int endIndex)
    返回新的字符串,是对原字符串从beginIndex开始到endIndex(不包含)的截取
  13. boolean endsWith(String suffix),startsWith(String prefix)
    是否以指定的前缀开始或者指定的后缀结尾
  14. startsWith(String prefix,int offset)
    测试此字符串从指定索引位置开始是以指定前缀开始的
  15. contains(CharSequence s)
    判断此字符串是否包含指定char值,因为String实现了CharSequence,所以char传入字符串就可以
  16. indexOf(String str)
    第一次出现字符串str的索引
  17. indexOf(String s,int fromIndex)
    指定位置开始第一次出现s的索引
  18. lastIndexOf(String str)
    最后一次,最右边出现str的索引
  19. replace(Char oldChar,Char newChar)
    返回一个新字符串,将oldChar全部换为newChar
  20. replace(CharSequence target,CharSequence replacement)
    用后者替换前者,参数也为String
  21. replaceAll(String regex,String replcement)
    使用replacement替换所有匹配正则表达式的子字符串
  22. replaceFirst(String regex,String replacement)
    使用replacement替换第一个匹配正则表达式的子字符串
  23. boolean matches(String regex)
    告知此字符串是否符合正则表达式
  24. String[] split(String regex)
    根据正则表达式拆分字符串
  25. String[] split(String regex,int limit)
    根据正则表达式拆分字符串放到字符串数组中,最多不超过limit,超过的全放在最后一个数组中

五、StringBuffer、StringBuilder类

1.StringBuffer
  1. 概述:继承AbstractStringBuilder类
  • 对字符串内容进行增删,不会产生新对象。
  • 方法与String类似
  • 作为参数传递时,方法内部可以改变值
  • 线程安全
public final class StringBuffer
    extends AbstractStringBuilder
    implements java.io.Serializable, Comparable<StringBuffer>, CharSequence
{
...
}
abstract class AbstractStringBuilder implements Appendable, CharSequence {
    /**
     * The value is used for character storage.
     */
    byte[] value;没有final,可以扩容,改变

    /**
     * The id of the encoding used to encode the bytes in {@code value}.
     */
    byte coder;
    /**
     * The count is the number of characters used.
     */
    int count;记录有效字符个数
    ....
}
  1. 构造方法
    三个构造器
  • StringBuffer():初始容量为16的字符串缓冲区
  • StringBuffer(int capacity):构造指定容量的字符串缓冲区
  • StringBuffer(CharSequence seq)
    StringBuffer(String str):将内容初始化为指定字符串内容
  1. 方法
  • append:拼接
  • delete(start,end):删除指定位置的内容
  • replace(start,end,str):把指定位置替换为str
  • insert(offset,xxx):在指定位置插入xxx
  • reverse():当前字符序列逆转
  • indexOf、substring、length、charAt、setCharAt
2.StringBuilder

StringBuilder和StringBuffer类似

String、StringBuild、StringBuffer区别

  • String(jdk1.0):不可变字符序列
  • StringBuffer(jdk1.0):可变字符系列、效率低、线程安全
  • StringBuilder(jdk5.0):可变字符序列、效率高、线程不安全

作为参数传递,方法内部String不会改变值,其他两个会改变值