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`是最重要的类之一,它是所有字符串操作的基础。这个类位于核心类库中,因此无需显式导入即可使用。本文将深入探讨`String`类的一些关键知识点,包括它的特性、构造方法、常用...
首先,`java.net.URL`类的构造器接受一个字符串参数,这个字符串是资源的完整URL地址。例如: ```java URL url = new URL("http://example.com/data.json"); ``` 创建URL对象后,我们可以调用`openConnection()`方法...
- `java.lang.reflect` 包:提供反射API,可以在运行时动态访问类、接口、构造器和方法。 8. **类型转换工具类**: - `java.util.Comparator`:用于比较对象,常用于集合排序。 - `java.util.Function`:Java 8...
1. **初始化**:`StringBuilder`可以通过无参构造器创建一个空的实例,也可以通过指定初始容量或初始字符串来创建实例。例如: ```java StringBuilder sb = new StringBuilder(); // 创建空的StringBuilder ...
9. **反射:** `java.lang.reflect` 包提供了一系列类和接口,用于获取类的信息,如类名、构造器、方法等,以及动态调用方法和访问属性。 10. **XML处理:** `javax.xml.parsers.DocumentBuilderFactory` 和 `org....
- `java.lang.StringBuilder#append()`: 字符串构建。 - `java.lang.StringBuffer#append()`: 字符串构建。 - `java.sql.PreparedStatement`: 预编译SQL语句。 - `javax.swing.GroupLayout.Group#addComponent()`: ...
【Java初级教程】Java语言程序设计的第7章主要探讨了Java中的一些常用类,包括`java.lang.String`、`java.lang.StringBuilder`和`java.util.StringTokenizer`。以下是对这些类的详细解释: 1. **`java.lang.String`...
`StringBuilder`提供了几个构造方法,例如无参构造器`StringBuilder()`,以及带初始容量的构造器`StringBuilder(int capacity)`。这些方法方便我们根据需求初始化字符串的容量。 2. **基本操作**: - `append()`...
- `java.lang.StringBuilder#append()`:用于构建字符串。 - `java.lang.StringBuffer#append()`:线程安全的字符串构建器。 - `java.nio.ByteBuffer#put()`:以及其他缓冲区类如`CharBuffer`、`ShortBuffer`等,...
Java中`java.lang.StringBuilder`和`java.lang.StringBuffer`就是构造者模式的实例。 5. **原型模式**:通过复制已有对象来创建新对象,减少创建新对象的成本。Java中`Object`类提供的`clone()`方法就是原型模式的...
本文将深入解析Java教程中提到的部分关键类,包括`java.applet`、`java.awt`、`java.io`、`java.lang`、`java.net`以及`java.util`等包下的常用类,特别关注`java.lang.String`类及其相关操作。 #### java.applet包...
在Java中,单例模式通常通过私有构造器和静态工厂方法实现,防止其他类实例化该类。 2. **工厂模式**:为创建对象提供一个接口,但让子类决定实例化哪一个类。Java中的Abstract Factory和Factory Method都是常见的...
5. **初始化(Initialization):** 执行类构造器 `<clinit>` 方法。 #### 八、异常关键字详解 1. **`throws`:** 用于声明一个方法可能会抛出的异常类型。 2. **`throw`:** 用于抛出一个异常对象。 3. **`try`:...
byte[] > String 通过 new String(byte[]) 构造器。String 和 byte[] 之间的转换非常常用,在实际应用中经常用到。 这 10 个 Java 经典的 String 面试题涵盖了 String 的基本特点、使用方法和常见问题。掌握这些...
在JDK中,字符缓冲区`java.lang.StringBuffer`和`StringBuilder`通过共享内部字符数组实现了享元模式。 18. 迭代器模式(Iterator):提供一种方法顺序访问聚合对象的元素,而又不暴露其底层表示。`java.util....
Java 开发人员面试知识点总结 ...Java 中有多种方式来新建对象,例如使用 new 关键字、使用构造器、使用工厂方法等。 1.16 & 和 && 的区别 & 是 Java 中的按位与运算符,&& 是 Java 中的逻辑与运算符。
相反,要从byte数组创建String,可以使用`String(byte[])`构造器。这种转换在处理二进制数据或编码问题时非常常见。 了解这些Java String相关的知识点对于任何Java开发者来说都是至关重要的,它们在日常编程和面试...
#### 二、Java 常用类库详解 ##### 1. `java.applet` - **主要功能**:提供了创建 Applet 所需的所有类。 - **应用场景**:适用于 Web 应用程序中的小应用程序开发。 ##### 2. `java.awt.*` - **主要功能**:...