`

java.lang.StringBuilder(三)常用方法之append()

阅读更多

    在前面的博客中写了关于append()方法,它是StringBuilder构造过程中常用的方法,在JDK6.0中,append()重载有十几种形式,而其中最常用的是append(String str),其作用是把一个字符串追加到当前的StringBuilder后面,最后返回修改后StringBuilder对象,当str=null,则直接在其后面加上"null"。下面我们分析一下JDK关于它的具体实现的流程。

    1

 public StringBuilder append(String str) {
	super.append(str);//跳到父类的方法中
        return this;//返回修改后的对象
    }

2、 再看看其父类AbstractStringBuilder中append(String str)的实现过程

    /**
     * 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";//此时直接把其当成“null”串来处理
        int len = str.length();//取得str的长度
	if (len == 0) return this;//Str=""时,可不再作处理,直接返回原对象
	int newCount = count + len;//当前串的长度(newCount) = 原有串长(count) + str的长度(用于更新StringBuilder的count属性值)
	if (newCount > value.length)//当前对象的长度大于其容量的条件下增加
	    expandCapacity(newCount);//扩展当前的对象的容量,具体见下面
	str.getChars(0, len, value, count);//把串的值依次插入到当前对象有末端(具体如下)
	count = newCount;//更新当前对象的容量属性
	return this;//返回当前对象(对象有内容和属性已修改)
    }

3、  从以上两个方法已经实现了功能,但其中调用的两个重要的方法:expanCapacity(int)和getChars(..),其实现原理相当重要,现源码如下:

   /**
     * This implements the expansion semantics of ensureCapacity with no
     * size check or synchronization.这里没有公步的check,所以用于单线程
     */
    void expandCapacity(int minimumCapacity) {//扩充当前对象的容量
	int newCapacity = (value.length + 1) * 2;//当前对象的内容的长度+1的2部(注意这里它的容量扩充方式)
        if (newCapacity < 0) {//不知为何作负数判断??
            newCapacity = Integer.MAX_VALUE;//返回2^31-1 的常量,表示 int 类型能够表示的最大值。
        } else if (minimumCapacity > newCapacity) {//当“自动扩充”的容量还是小于当前的容量,则把当前容量传给它(再见分配时以当前容量为准)
	    newCapacity = minimumCapacity;//赋值
	}
        value = Arrays.copyOf(value, newCapacity);//把原有char[] value用null补其到newCapacity个数,(见下面例一)
    }

 4、说明:从上面方法可看出,StringBulider在每次调用append()当合并后的长度大于当前容量都会变为value.length(修改前对象的长度)*2,所以这里有性能的注意点,如果明确长度时,尽量在定义StringBuilder时指定其容量值。

5、在看2中方法调用的getChars()方法的,它是String类中的一个处理方法。将字符从此字符串复制到目标字符数组(还是后面再写String时再聊这个)。

 

6、示例一,说明Arrays.copyOf(value, newCapacity)的使用过程,说明:复制指定的数组,截取或用 null 字符填充(如有必要),以使副本具有指定的长度。对于在原数组和副本中都有效的所有索引,这两个数组将包含相同的值。对于在副本中有效而在原数组无效的所有索引,副本将包含 '\\u000'(null)。当且仅当指定长度大于原数组的长度时,这些索引存在。

 

		char[] oldChar ={'a','b'};//定义并初始化一个char数组
		char[] newChar = Arrays.copyOf(oldChar, 3);//取得一个副本newChar,且长度为3,这里就会用null补充
		char[] newCharCut = Arrays.copyOf(oldChar, 1);//取得一个副本newCharCut,长度变小,则直接把后面的部分截取
		System.out.println(newChar[2]);//打印出来为null,
		System.out.println(newChar.length);//打印输出为3,补充一位null
		System.out.println(newCharCut.length);//打印输出为1,截取了最后一们'b'.

 

 

                                                              2011-01-19 卓

分享到:
评论

相关推荐

    Java StringBuilder

    `StringBuilder`类位于`java.lang`包中,它继承自`AbstractStringBuilder`,并实现了`Appendable`和`CharSequence`接口。这个类提供了各种方法来添加、插入、删除和替换字符串中的字符,使得字符串操作更为便捷。 1...

    java中stringBuilder的用法.pdf

    Java中的StringBuilder是一个非常重要的类,它位于java.lang包中,被广泛应用于字符串操作中。StringBuilder的主要作用是提供一个可变的字符序列,用以替代不可变的String,以提高性能和效率。当需要频繁修改字符串...

    java基础--4.常用类-3.StringBuffer、StringBuilder

    `StringBuffer`和`StringBuilder`提供了`append()`方法,可以将任意类型的数据转换为字符串并追加到已有字符串的末尾。 - 例如,`stringBuffer.append("Hello").append(" ").append("World");`将创建一个"Hello ...

    JAVA中常用类的常用方法.docx

    JAVA 中有许多常用的类,每个类都有其特定的方法,本文将对 java.lang.Object 类、String 类和 StringBuffer 类的常用方法进行讲解。 一、java.lang.Object类 java.lang.Object 类是 JAVA 中所有类的父类,它提供...

    Java StringBuilder类原理及常用方法

    Java StringBuilder类原理及常用方法 Java StringBuilder类是一种可变字符序列, 它是一个字符串缓冲区,可以通过某些方法调用改变该序列的长度和内容。StringBuilder内部拥有一个数组用来存放字符串内容,进行字符...

    java.net.URL测试代码

    `java.net.URLConnection`则是`URL`的子接口,它提供了与资源进行交互的方法,如打开连接、读取数据、设置请求头等。在“java.net.URL测试代码”的场景中,我们通常会用到这两个类来实现网络编程中的跨域请求,并...

    完整版 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详解

    - `append()`:这是`StringBuilder`最常用的方法,用于在已有字符串后面添加新的字符或对象。例如,`sb.append("Hello").append(" World");`将生成"Hello World"。 - `insert()`:此方法可以在指定位置插入字符或...

    《Java设计模式》课后习题参考答案-刘伟(20180723).pdf

    - java.lang.StringBuilder#append(),字符串构建器。 - javax.swing.GroupLayout.Group#addComponent(),添加组件到分组。 c) 工厂方法模式(FactoryMethod) 工厂方法模式定义了一个创建对象的接口,但由子类...

    JAVA设计模式在JDK中的应用

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

    JDK中的设计模式

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

    07 StringBuilder

    `StringBuilder`的核心方法包括`append()`、`insert()`等,这些方法可以接受各种类型的参数,并将它们转换为字符串后添加到当前的`StringBuilder`对象中。 1. **append()**:该方法用于将指定的字符串或其他类型的...

    JAVA中用动态代理类实现记忆功能(二).rar

    动态代理主要依赖于Java的`java.lang.reflect.Proxy`类和`java.lang.reflect.InvocationHandler`接口。首先,我们需要定义一个接口,这个接口代表了我们想要代理的行为。例如,我们可以创建一个名为`Calculable`的...

    关于在Idea调试的时候如何显示16进制的处理.doc

    java.lang.String hex = java.lang.Integer.toHexString(this&0xFF); if (hex.length()) { hex = "0"+hex; } return "0x"+hex.toUpperCase() +" ["+this+"]"; ``` 这个表达式将字节转换为 16 进制表示,并添加“0x...

    通过java的反射技术获取,某个包路径下的类,并以表格形式打印类的属性注解注释及属性名称等

    这个技术主要基于Java.lang.reflect包中的类和接口,如Class、Constructor、Method和Field等。在给定的场景中,我们需要实现的功能是遍历指定包路径下的所有类,获取它们的属性信息,包括属性的注解和注释,并以表格...

    sql语句转 StringBuilder buffer

    `StringBuilder` 和 `StringBuffer` 都是Java中的类,位于`java.lang`包下,它们都用于处理字符串的拼接。与直接使用`+`操作符连接字符串相比,这两个类提供了更高效的方法,因为它们内部使用了缓冲区,避免了每次...

    java进阶笔记.pdf

    本资源摘要信息主要涵盖 Java 编程语言的基础知识,包括 Java API 的概述、String 类的概述、String 构造方法、String 对象的特点、StringBuilder 类的概述、StringBuilder 构造方法、StringBuilder 的添加和反转等...

    java随机码生成程序

    Java提供了丰富的库和方法来实现这个功能。下面将详细讨论如何在Java中创建随机码生成程序。 首先,我们可以使用`java.util.Random`类来生成随机整数或浮点数。`Random`类是Java内置的随机数生成器,可以生成0到...

Global site tag (gtag.js) - Google Analytics