zoukankan      html  css  js  c++  java
  • java.lang.StringBuilder源码分析

    StringBuilder是一个可变序列的字符数组对象,它继承自AbstractStringBuilder抽象类。它不保证同步,设计出来的目的是当这个字符串缓存只有单线程使用的时候,取代StringBuffer的。建议使用它而不是StringBuffer,因为它的速度更快。

    StringBuilder有自己的容量(字符数组),当容量还没有被占满的时候,不必申请新的空间,当容量被占满后,它会自动地扩容。

    public final class StringBuilder extends AbstractStringBuilder
        implements java.io.Serializable, CharSequence {
        public StringBuilder() {//构造方法只是调用父类的构造器
            super(16);
        }
        
        public StringBuilder(int capacity) {//capacity指定容量大小
            super(capacity);
        }
    
        public StringBuilder(String str) {//str指定初始容器存放的字符串,容量是str.length+16
            super(str.length() + 16);
            append(str);
        }
    
        public StringBuilder(CharSequence seq) {
            this(seq.length() + 16);
            append(seq);
        }
    
      //StringBuilder重载了父类所有的append方法,以支持添加任何类型的数据到容器中 @Override
    public StringBuilder append(Object obj) { return append(String.valueOf(obj)); } @Override public StringBuilder append(String str) { super.append(str); return this; } public StringBuilder append(StringBuffer sb) { super.append(sb); return this; } @Override public StringBuilder append(CharSequence s) { super.append(s); return this; } public StringBuilder append(CharSequence s, int start, int end) { super.append(s, start, end); return this; } @Override public StringBuilder append(char[] str) { super.append(str); return this; } //...更多的append重载方法,实现在StringBuilder append所有数据类型 public StringBuilder appendCodePoint(int codePoint) {//这个方法是通过Unicode编码来append一个字符,比如'a'的Unicode=97,appendCodePoint(97)相当于把a添加到容器末尾 super.appendCodePoint(codePoint); return this; } public StringBuilder delete(int start, int end) {//删除end-start的子串 super.delete(start, end); return this; } public StringBuilder deleteCharAt(int index) {//删除index下标的字符 super.deleteCharAt(index); return this; } public StringBuilder replace(int start, int end, String str) {//用str取代end-start的子串 super.replace(start, end, str); return this; }
      //insert方法实现在字符串的任意位置插入数据
    public StringBuilder insert(int index, char[] str, int offset, int len) { super.insert(index, str, offset, len); return this; } //...更多的insert重载方法 public int indexOf(String str) {//找到子串的起始位置 return super.indexOf(str); } //...更多的indexOf重载方法,实现找到子串的位置 public StringBuilder reverse() {//将容器内的字符串倒转 super.reverse(); return this; } public String toString() {//toString是返回new一个String对象 // Create a copy, don't share the array return new String(value, 0, count); } private void writeObject(java.io.ObjectOutputStream s)//writeObeject提供序列化机制 throws java.io.IOException { s.defaultWriteObject(); s.writeInt(count); s.writeObject(value); } private void readObject(java.io.ObjectInputStream s)//readObject提供反序列化机制 throws java.io.IOException, ClassNotFoundException { s.defaultReadObject(); count = s.readInt(); value = (char[]) s.readObject(); } }

    StringBuilder内部维护一个字符数组,在这个字符数组上对字符进行各种操作,当需要对字符串进行频繁操作时,StringBuilder能提供很好的性能,比起直接操作String,它不需要创建很多对象。

  • 相关阅读:
    如何注册一个ens域名
    storj
    Polygon
    拜占庭容错
    10秒钟完成metamask上任意公链主网添加
    Logistic Regression
    Normal Equations
    神经网络学习笔记 lecture3:The backpropagation learning proccedure
    Three Types of Learning
    Exercise: Logistic Regression and Newton's Method
  • 原文地址:https://www.cnblogs.com/13jhzeng/p/5618500.html
Copyright © 2011-2022 走看看