`

StringBuffer源码浅析(insert方法)

 
阅读更多
一、insert,其实跟replace差不多,都是先通过System.arraycopy Method在字符数组value中预留一个空间,再用多一次这方法插入str或char[]。
1、insert(int index, char str[], int offset,int len)围观源码
// StringBuffer里面,调用父类的方法
public synchronized StringBuffer insert(int index, char str[], int offset,
                                            int len) 
    {
        super.insert(index, str, offset, len);
        return this;
    }

进入AbstractStringBuilder查看
    public AbstractStringBuilder insert(int index, char str[], int offset,
                                        int len)
    {
        // bounds checking
        if ((index < 0) || (index > length()))
	    throw new StringIndexOutOfBoundsException(index);
        // 注意:offset的值,offset + len不应大于str.length
        if ((offset < 0) || (len < 0) || (offset > str.length - len)) 
            throw new StringIndexOutOfBoundsException(
                "offset " + offset + ", len " + len + ", str.length " 
                + str.length);
	int newCount = count + len;
	if (newCount > value.length)
	    expandCapacity(newCount);
        // 从index开始,预留了长度为len的空间;从index+len开始,将长度为count-index的后半截补充。
	System.arraycopy(value, index, value, index + len, count - index);
        // str字符串数组,从索引offset开始复制,长度为len,复制到以索引index位置的value字符串数组。
	System.arraycopy(str, offset, value, index, len);
	count = newCount; //记得更新实际字符长度(字符数量)。
	return this;
    }


2、顺便看insert(int offset,String str) 对比 insert(int offset, Object obj)
  
// 将obj返回字符串形式,一样是调用父类insert(int offset,String str) 
public synchronized StringBuffer insert(int offset, Object obj) {
	super.insert(offset, String.valueOf(obj));
        return this;
    }

进入AbstractStringBuilder查看,跟第1点一样
public AbstractStringBuilder insert(int offset, String str) {
	if ((offset < 0) || (offset > length()))
	    throw new StringIndexOutOfBoundsException(offset);
	if (str == null)
	    str = "null";
	int len = str.length();
	int newCount = count + len;
	if (newCount > value.length)
	    expandCapacity(newCount);
	System.arraycopy(value, offset, value, offset + len, count - offset);
	str.getChars(value, offset); //getChars封装了System.arraycopy Method
	count = newCount;
	return this;
    }

  insert(int offset, char str[])操作一样不解释。

3、insert(int dstOffset, CharSequence s)
public StringBuffer insert(int dstOffset, CharSequence s) {
        // Note, synchronization achieved via other invocations
        if (s == null)
            s = "null";
        if (s instanceof String)
            // 调用第2点,insert(int offset,String s)
            return this.insert(dstOffset, (String)s);
           // 看抽象类的方法定义
        return this.insert(dstOffset, s, 0, s.length());
    }

进入抽象类
public AbstractStringBuilder insert(int dstOffset, CharSequence s,
                                           int start, int end) {
        if (s == null)
            s = "null";
	if ((dstOffset < 0) || (dstOffset > this.length()))
	    throw new IndexOutOfBoundsException("dstOffset "+dstOffset);
	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;
        if (len == 0)
            return this;
	int newCount = count + len;
	if (newCount > value.length)
	    expandCapacity(newCount);
        // 以上大同小异,不说
        // 预留空间
	System.arraycopy(value, dstOffset, value, dstOffset + len,
                         count - dstOffset);
        // start 到 end,逐个字符赋值到预留的空间上。
	for (int i=start; i<end; i++)
            value[dstOffset++] = s.charAt(i);
	count = newCount;
        return this;
    }

分享到:
评论

相关推荐

    String StringBuffer和StringBuilder区别之源码解析

    "String StringBuffer和StringBuilder区别之源码解析" 在Java中,字符串是我们经常使用的数据类型,而String、StringBuffer和StringBuilder是Java中三种常用的字符串类。在这篇文章中,我们将从源码角度对String、...

    StringBuffer类的常用方法.md

    StringBuffer类的常用方法.md

    StringBuffer

    3. insert 方法:往字符串中间插入字符或字符串,可以指定插入的位置。 4. delete 和 deleteCharAt 方法:删除字符串中的子串或者字符,可以指定删除的起始和终止位置。 5. replace 方法:用于替换子串,可以指定要...

    StringBuffer & StringBuilder 源码分析.docx

    StringBuffer & StringBuilder 源码分析 StringBuffer 和 StringBuilder 是 Java 语言中两个常用的字符串操作类,它们都是 CharSequence 接口的实现类,并且都继承了 AbstractStringBuilder 类。下面是对这两个类的...

    Java StringBuilder和StringBuffer源码分析

    除了`append()`方法,`StringBuilder`和`StringBuffer`还提供了`insert()`, `delete()`, `replace()`等方法来修改字符串。这些方法的实现都基于`AbstractStringBuilder`,在进行相应操作时,都会先检查并调整容量,...

    从源码角度简单看StringBuilder和StringBuffer的异同(全面解析)

    StringBuilder的主要操作是append和insert方法,这些方法可以将任何类型的数据转换为字符串,并将其添加或插入到StringBuilder中。 StringBuffer的特点 StringBuffer是StringBuilder的线程安全版本,它提供了与...

    Java中StringBuffer的常用方法.pdf

    insert方法允许我们在StringBuffer对象的指定位置插入内容。这个方法接受一个索引参数和一个要插入的数据参数。当我们在某个特定的位置需要插入数据时,insert方法提供了这种灵活性。例如: ```java StringBuffer ...

    String、StringBuffer、StringBuilder的使用方法

    它的内部机制与`String`类似,但是提供了`append()`和`insert()`等方法来改变字符串内容,而不会每次都创建新对象。例如: ```java StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // 不会...

    StringBuffer类的总结

    2. **追加内容**:使用 `append()` 方法可以将指定的内容添加到 `StringBuffer` 的末尾。 ```java sb.append("要追加的字符串"); ``` 3. **插入内容**:使用 `insert()` 方法可以在指定位置插入内容。 ```java ...

    Java语言中StringBuffer的用法

    在多线程环境下,`StringBuffer`的方法如`append()`和`insert()`都是同步的,保证了线程安全。 接下来,我们详细讲解`StringBuffer`的一些关键方法: 1. **append()**:此方法用于在现有字符串末尾添加新的字符...

    String&Stringbuffer

    3. **线程安全性**:`StringBuffer`的所有方法都是同步的,因此它是线程安全的,而`String`类本身没有提供线程安全机制。 4. **内存占用**:由于`String`对象的不可变性,当频繁地修改一个字符串时,会产生大量的...

    Java中StringBuffer对象的初始化.pdf

    `StringBuffer`还提供了其他一些方法,如`insert()`, `delete()`, `replace()`, `length()`, `capacity()`, 和 `ensureCapacity()`等,用于在字符串中插入、删除、替换字符,以及调整和查询缓冲区容量。 总的来说,...

    java高级特性StringBuffer类.doc

    Java 高级特性 StringBuffer ...append 方法是 StringBuffer 类中的一种常用方法,该方法的作用是追加内容到当前 StringBuffer 对象的末尾,类似于字符串的连接。调用该方法以后,StringBuffer 对象的内容也发生改变。

    源码string和stringbuffer

    针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍...

    String,StringBuffer,StringBuilder区别

    StringBuffer的方法大多是同步的,这意味着多个线程可以安全地同时调用StringBuffer对象的方法。然而,线程安全带来的好处是以性能为代价的,因为同步方法的执行需要更多的CPU资源。StringBuffer在内部使用一个可...

    java之StringBuffer常见使用方法解析

    "java之StringBuffer常见使用方法解析" 今天,我们来聊聊Java中的StringBuffer类,它是一个非常重要的字符串缓冲区类,广泛应用于Java编程中。下面,我们将详细介绍StringBuffer类的使用方法和应用场景。 什么是...

    打包工具exe Stringbuffer sql工具

    例如,你可以使用`append()`方法添加字符或字符串,`insert()`方法在指定位置插入内容,以及`delete()`方法移除部分文本。 然后,`SQL`(Structured Query Language)是一种用于管理关系数据库的标准语言。它被广泛...

    java_初学者必须了解的基本知识.doc

    8. 在指定位置插入内容:StringBuffer提供了insert方法,例如stringBuffer.insert(0, "Hello")。 9. 判断其中是否存在某个字符串:String提供了contains方法,StringBuffer不提供类似方法。 10. 判断其中是否存在...

Global site tag (gtag.js) - Google Analytics