`

StringBuffer源码浅析(replace与substring方法)

 
阅读更多
一、replace方法也比较简单。围观源码
public AbstractStringBuilder replace(int start, int end, String str) {
        if (start < 0)
	    throw new StringIndexOutOfBoundsException(start);
	if (start > count)
	    throw new StringIndexOutOfBoundsException("start > length()");
	if (start > end)
	    throw new StringIndexOutOfBoundsException("start > end");
        // 以上都是一些Bounds Checking,没什么好说。
	if (end > count) //若替换字符边界超出字符长度,把字符长度赋予边界量
	    end = count;
	int len = str.length();
        //新字符长度,要加上替换长度,减去截取长度
	int newCount = count + len - (end - start);
	if (newCount > value.length) //是否大于已有容量,是则扩容
	    expandCapacity(newCount);
        //复制数组,先预留替换字符串str的长度,看后面的解释。
        //src      the source array.
        //srcPos   starting position in the source array.
        //dest     the destination array.
        //destPos  starting position in the destination data.
        //length   the number of array elements to be copied.

        System.arraycopy(value, end, value, start + len, count - end);

        str.getChars(value, start);//填充str到value,start索引开始

        count = newCount;
        return this;
    }


   len
|------|str   str替换字符串


            start        end
|-------------+-----------+--------------|  count
                           </count-end/>


           start   start + len   
|-------------|------|--------------|  count
                预留  </count-end/> 

从src的end开始复制,到dst的start+len开始
先预留用于存放str的空间,也就是从start开始 + len
而原先截取剩下的(长度为count-end),放到start+len的后面

二、substring方法,简单喔!
1、在StringBuffer类中源码
// 不解释
public synchronized String substring(int start) {
        return substring(start, count);
    }

 public synchronized String substring(int start, int end) {
        return super.substring(start, end); // super调用父类方法,真正源码在AbstractStringBuilder
    }


2、进入AbstractStringBuilder抽象类围观
 public String substring(int start, int end) {
        //边界检查很重要骚年(疑问:为什么不把他们封装起来命名为boundsCheck()方法,看到其他地方都重复代码了)
	if (start < 0)
	    throw new StringIndexOutOfBoundsException(start);
	if (end > count)
	    throw new StringIndexOutOfBoundsException(end);
	if (start > end)
	    throw new StringIndexOutOfBoundsException(end - start);
        // 没有很复杂,new一个String而已。
        return new String(value, start, end - start);
    }

3、进来看这个String的构造方法
     /* @param  value
     *         Array that is the source of characters
     *
     * @param  offset
     *         The initial offset
     *
     * @param  count
     *         The length
     */
  public String(char value[], int offset, int count) {
        if (offset < 0) {
            throw new StringIndexOutOfBoundsException(offset);
        }
        if (count < 0) {
            throw new StringIndexOutOfBoundsException(count);
        }
        // 这个重点条件 offset or count might be near -1>>>1.
        if (offset > value.length - count) {
            throw new StringIndexOutOfBoundsException(offset + count);
        }
        this.offset = 0;
        this.count = count;
        //这里又是利用copyOfRange(其实它也是利用System.arraycopy)
        this.value = Arrays.copyOfRange(value, offset, offset+count);
    }

不怕烦,把Arrays.copyOfRange源码再贴出来吧
 public static char[] copyOfRange(char[] original, int from, int to) {
        int newLength = to - from;
        if (newLength < 0)
            throw new IllegalArgumentException(from + " > " + to);
        char[] copy = new char[newLength];
        // 整天都是arraycopy,src数组到分配了newLength长度的新数组,并返回新数组。
        System.arraycopy(original, from, copy, 0,
                         Math.min(original.length - from, newLength));
        return copy;
    }

算蛮简单的,但都是我借你的方法用一下,你借我方法用一下,一个字,绕!
在想有些简单的,需不需要写博客记录?!
分享到:
评论

相关推荐

    String StringBuffer和StringBuilder区别之源码解析

    在StringBuilder类的源码中,我们可以看到,它的扩容机制与StringBuffer类相同,也是以16为单位进行扩容的。 String、StringBuffer和StringBuilder的比较 通过上面的分析,我们可以看到,String类的字符串是不可变...

    StringBuffer

    5. replace 方法:用于替换子串,可以指定要替换的子串和新的子串。 6. reverse 方法:将字符串倒序,可以用于变换字符串的顺序。 实例演示 下面是一个使用 StringBuffer 类操作字符串的示例代码: ```java ...

    StringBuffer & StringBuilder 源码分析.docx

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

    StringBuffer类的常用方法.md

    StringBuffer类的常用方法.md

    java 如何使用substring()方法截取子串

    - `substring()`和`subSequence()`相似,但`subSequence()`是`CharSequence`接口的方法,它可以应用于任何实现了`CharSequence`的类,如`StringBuilder`和`StringBuffer`。 7. **优化建议**: - 如果需要频繁操作...

    Java StringBuilder和StringBuffer源码分析

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

    String&Stringbuffer

    #### 四、String与StringBuffer的操作方法 - **String**: - `charAt(int index)`:返回指定索引处的字符。 - `concat(String str)`:将当前字符串与另一个字符串连接起来。 - `indexOf(String str)`:返回指定...

    String与StringBuffer区别详解

    而StringBuffer示例中,使用append方法实际上是在修改原有对象的内容,并且这种修改会反映在所有指向这个StringBuffer对象的引用上。 为了进一步理解二者的差异,我们可以通过String和StringBuffer的内存使用和操作...

    String、StringBuffer、StringBuilder的使用方法

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

    Java语言中StringBuffer的用法

    本文将深入探讨`StringBuffer`的用法,包括其常用方法,并通过实例对比`StringBuffer`与`String`的区别。 首先,我们来了解`StringBuffer`的核心特性。`String`类在进行字符串拼接时会创建新的对象,而`...

    String ,StringBuffer与StringBuilder

    String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...

    Java基础之常用类集合,异常、IO文件等基础使用

    StringBuffer 的截取功能包括 substring 方法,可以从指定位置截取到末尾或截取从指定位置开始到结束位置。 在实际开发中,我们经常需要将数组转换成字符串,可以使用 StringBuffer 的 append 方法来实现。例如,...

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

    本文将从源码角度对StringBuilder和StringBuffer的异同进行详细的解析。 StringBuilder的特点 根据Java文档,StringBuilder是一个可变的字符序列,提供了与StringBuffer兼容的API,但是不保证同步。这意味着...

    Java中StringBuffer对象的初始化.pdf

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

    StringBuffer类的总结

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

    StringBuffer总结

    与不可变的`String`类不同,`StringBuffer`对象可以在创建后进行修改,这使得它非常适合在需要频繁修改字符串内容的应用场景中使用。 ### StringBuffer的特点 #### 1. 字符串缓冲区 `StringBuffer`可以被视为一个...

Global site tag (gtag.js) - Google Analytics