`

java.lang.StringBuilder(二)构造器

阅读更多

StringBuilder的父类为:java.lang.AbstractStringBuilder这一抽象类,在JDK的源码中可以查到,但在JDK6.0的文档却没有此类不知为何,这里就不讨论它。

   StringBuilder共有4个构造器,如下:

1、StringBuilder() 构造一个其中不带字符的字符串生成器,初始容量为 16 个字符(理解这里返回一个长度为0,初始容量为16的StringBuilder。

    源码:

/**
     * Constructs a string builder with no characters in it and an 
     * initial capacity of 16 characters. 
     */
    public StringBuilder() {
	super(16);//这里直接调用了父类构造器:AbstractStringBuilder(int ..)
    }

 AbstractStringBuilder(int)源码:

    /** 
     * Creates an AbstractStringBuilder of the specified capacity.
     */
    AbstractStringBuilder(int capacity) {
        value = new char[capacity];//得到一个char数组
    }

 所以从上面两源码片段,可见StringBuilder()所得到的容量是16的,但由于count没有值,所以长度为0,这一点以后讨论,看第二个构造器

 

2、StringBuilder(CharSequence seq)  构造一个字符串生成器,包含与指定的 CharSequence 相同的字符。

/**
     * Constructs a string builder that contains the same characters
     * as the specified <code>CharSequence</code>. The initial capacity of
     * the string builder is <code>16</code> plus the length of the
     * <code>CharSequence</code> argument.
     *
     * @param      seq   the sequence to copy.
     * @throws    NullPointerException if <code>seq</code> is <code>null</code>
     */
    public StringBuilder(CharSequence seq) {//对CharSequence 要理解哟
        this(seq.length() + 16);//这里调用了this(int)构造器,设置当前StringBuilder的容量为(seq+16)
        append(seq);//调用本类的的append(seq)方法,见下面:
    }

 /**
     * @throws IndexOutOfBoundsException {@inheritDoc} 父类中抛出
     */
    public StringBuilder append(CharSequence s) {
        if (s == null)
            s = "null"; 
        if (s instanceof String)
            return this.append((String)s);
        if (s instanceof StringBuffer)
            return this.append((StringBuffer)s);
        if (s instanceof StringBuilder)
            return this.append((StringBuilder)s);
        return this.append(s, 0, s.length());//见以下函数
    }

    /**
     * @throws     IndexOutOfBoundsException {@inheritDoc}
     */
    public StringBuilder append(CharSequence s, int start, int end) {
        super.append(s, start, end);//父类的append见个代码片段
        return this;
    }

父类的   super.append(s, start, end)源码:
 public AbstractStringBuilder append(CharSequence s, int start, int end) {
        if (s == null)
            s = "null";
	if ((start < 0) || (end < 0) || (start > end) || (end > s.length()))//长度溢出判断
	    throw new IndexOutOfBoundsException(//抛出异常
                "start " + start + ", end " + end + ", s.length() " 
                + s.length());
	int len = end - start;//len为从中截取的长度
	if (len == 0)
            return this;//如果起始位置相同,则对内容不作处理,返回原对象
	int newCount = count + len;//count为当前对象的长度 + 截取的长度len
	if (newCount > value.length)//如果当前长度大于value的容量则增加对象容量
	    expandCapacity(newCount);//把当前对象的容量设置为newCount,这里不再讨论此方法
        for (int i=start; i<end; i++)//把串中截取部分的值,追加到当前对象的value[]数组,也就是最终的值中
            value[count++] = s.charAt(i);//每次加一个
        count = newCount;//修改当前对象的长度(理解长度与容量的变化过程)
	return this;返回当前对象
    }
 

 3、StringBuilder(int capacity) 构造一个其中不带字符的字符串生成器,初始容量capacity 参数指定。

     只初始化容量,这个构造器在上面提到过,现在来看看它的实现过程:

     构造器源码:

  

  /**
     * Constructs a string builder with no characters in it and an 
     * initial capacity specified by the <code>capacity</code> argument. 
     *
     * @param      capacity  the initial capacity.
     * @throws     NegativeArraySizeException  if the <code>capacity</code>
     *               argument is less than <code>0</code>.
     */
 public StringBuilder(int capacity) {//只初化一个没有字符内容的(长度为0),容量为capacity的StringBuilder
	super(capacity);//调用父类构造器:AbstractStringBuilder(int ..),具体实现见第一构造中有
    }

 

 4、StringBuilder(String str)   构造一个字符串生成器,并初始化为指定的字符串内容。

 

    /**
     * Constructs a string builder initialized to the contents of the 
     * specified string. The initial capacity of the string builder is 
     * <code>16</code> plus the length of the string argument.  
     *
     * @param   str   the initial contents of the buffer.
     * @throws    NullPointerException if <code>str</code> is <code>null</code>
     */
    public StringBuilder(String str) {
	super(str.length() + 16);//调用父构造器:AbstractStringBuilder(int ..),注意容量加了16
	append(str);
    }
  public StringBuilder append(String str) {
 super.append(str);
        return this;
    }

父类的append(String)

   /**
     * Appends the specified string to this character sequence.
     * <p>
     * The characters of the <code>String</code> argument are appended, in 
     * order, increasing the length of this sequence by the length of the 
     * argument. If <code>str</code> is <code>null</code>, then the four 
     * characters <code>"null"</code> are appended.
     * <p>
     * Let <i>n</i> be the length of this character sequence just prior to 
     * execution of the <code>append</code> method. Then the character at 
     * index <i>k</i> in the new character sequence is equal to the character 
     * at index <i>k</i> in the old character sequence, if <i>k</i> is less 
     * than <i>n</i>; otherwise, it is equal to the character at index 
     * <i>k-n</i> in the argument <code>str</code>.
     *
     * @param   str   a string.
     * @return  a reference to this object.
     */
    public AbstractStringBuilder append(String str) {
	if (str == null) str = "null";
        int len = str.length();
	if (len == 0) return this;
	int newCount = count + len;
	if (newCount > value.length)
	    expandCapacity(newCount);
	str.getChars(0, len, value, count);//赋值过程,不具体讨论了
	count = newCount;
	return this;
    }

 好了,写到这里,写得很乱,没有添加什么东西,呵呵,那就写给自己看哈。

 

                                  2011-01-19  卓

分享到:
评论

相关推荐

    Java类库复习——java.lang.String

    在Java编程语言中,`java.lang.String`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...

    java.net.URL测试代码

    首先,`java.net.URL`类的构造器接受一个字符串参数,这个字符串是资源的完整URL地址。例如: ```java URL url = new URL("http://example.com/data.json"); ``` 创建URL对象后,我们可以调用`openConnection()`方法...

    java工具类

    - `java.lang.reflect` 包:提供反射API,可以在运行时动态访问类、接口、构造器和方法。 8. **类型转换工具类**: - `java.util.Comparator`:用于比较对象,常用于集合排序。 - `java.util.Function`:Java 8...

    Java StringBuilder

    1. **初始化**:`StringBuilder`可以通过无参构造器创建一个空的实例,也可以通过指定初始容量或初始字符串来创建实例。例如: ```java StringBuilder sb = new StringBuilder(); // 创建空的StringBuilder ...

    Java常用工具类

    9. **反射:** `java.lang.reflect` 包提供了一系列类和接口,用于获取类的信息,如类名、构造器、方法等,以及动态调用方法和访问属性。 10. **XML处理:** `javax.xml.parsers.DocumentBuilderFactory` 和 `org....

    JAVA设计模式在JDK中的应用

    - `java.lang.StringBuilder#append()`: 字符串构建。 - `java.lang.StringBuffer#append()`: 字符串构建。 - `java.sql.PreparedStatement`: 预编译SQL语句。 - `javax.swing.GroupLayout.Group#addComponent()`: ...

    完整版 Java初级教程 Java语言程序设计 第7章 Java中的常用类(共14页).ppt

    【Java初级教程】Java语言程序设计的第7章主要探讨了Java中的一些常用类,包括`java.lang.String`、`java.lang.StringBuilder`和`java.util.StringTokenizer`。以下是对这些类的详细解释: 1. **`java.lang.String`...

    java StringBuilder详解

    `StringBuilder`提供了几个构造方法,例如无参构造器`StringBuilder()`,以及带初始容量的构造器`StringBuilder(int capacity)`。这些方法方便我们根据需求初始化字符串的容量。 2. **基本操作**: - `append()`...

    JDK中的设计模式

    - `java.lang.StringBuilder#append()`:用于构建字符串。 - `java.lang.StringBuffer#append()`:线程安全的字符串构建器。 - `java.nio.ByteBuffer#put()`:以及其他缓冲区类如`CharBuffer`、`ShortBuffer`等,...

    JAVA常见的设计模式+源码+ppt+pdf

    Java中`java.lang.StringBuilder`和`java.lang.StringBuffer`就是构造者模式的实例。 5. **原型模式**:通过复制已有对象来创建新对象,减少创建新对象的成本。Java中`Object`类提供的`clone()`方法就是原型模式的...

    Java教程 Java常用类

    本文将深入解析Java教程中提到的部分关键类,包括`java.applet`、`java.awt`、`java.io`、`java.lang`、`java.net`以及`java.util`等包下的常用类,特别关注`java.lang.String`类及其相关操作。 #### java.applet包...

    Java与模式.rar

    在Java中,单例模式通常通过私有构造器和静态工厂方法实现,防止其他类实例化该类。 2. **工厂模式**:为创建对象提供一个接口,但让子类决定实例化哪一个类。Java中的Abstract Factory和Factory Method都是常见的...

    文章分类:Java编程,java面试题2

    5. **初始化(Initialization):** 执行类构造器 `&lt;clinit&gt;` 方法。 #### 八、异常关键字详解 1. **`throws`:** 用于声明一个方法可能会抛出的异常类型。 2. **`throw`:** 用于抛出一个异常对象。 3. **`try`:...

    10个Java经典的String面试题

    byte[] &gt; String 通过 new String(byte[]) 构造器。String 和 byte[] 之间的转换非常常用,在实际应用中经常用到。 这 10 个 Java 经典的 String 面试题涵盖了 String 的基本特点、使用方法和常见问题。掌握这些...

    JDK中有关23个经典设计模式的示例

    在JDK中,字符缓冲区`java.lang.StringBuffer`和`StringBuilder`通过共享内部字符数组实现了享元模式。 18. 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。`java.util....

    2023年开发人员面试宝典Java版.docx

    Java 开发人员面试知识点总结 ...Java 中有多种方式来新建对象,例如使用 new 关键字、使用构造器、使用工厂方法等。 1.16 & 和 && 的区别 & 是 Java 中的按位与运算符,&& 是 Java 中的逻辑与运算符。

    10个Java经典的String面试题!.pdf

    相反,要从byte数组创建String,可以使用`String(byte[])`构造器。这种转换在处理二进制数据或编码问题时非常常见。 了解这些Java String相关的知识点对于任何Java开发者来说都是至关重要的,它们在日常编程和面试...

    Java类库 java中常用的类 可以参考

    #### 二、Java 常用类库详解 ##### 1. `java.applet` - **主要功能**:提供了创建 Applet 所需的所有类。 - **应用场景**:适用于 Web 应用程序中的小应用程序开发。 ##### 2. `java.awt.*` - **主要功能**:...

Global site tag (gtag.js) - Google Analytics