一、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;
}
算蛮简单的,但都是我借你的方法用一下,你借我方法用一下,一个字,绕!
在想有些简单的,需不需要写博客记录?!
分享到:
相关推荐
在StringBuilder类的源码中,我们可以看到,它的扩容机制与StringBuffer类相同,也是以16为单位进行扩容的。 String、StringBuffer和StringBuilder的比较 通过上面的分析,我们可以看到,String类的字符串是不可变...
5. replace 方法:用于替换子串,可以指定要替换的子串和新的子串。 6. reverse 方法:将字符串倒序,可以用于变换字符串的顺序。 实例演示 下面是一个使用 StringBuffer 类操作字符串的示例代码: ```java ...
StringBuffer & StringBuilder 源码分析 StringBuffer 和 StringBuilder 是 Java 语言中两个常用的字符串操作类,它们都是 CharSequence 接口的实现类,并且都继承了 AbstractStringBuilder 类。下面是对这两个类的...
StringBuffer类的常用方法.md
- `substring()`和`subSequence()`相似,但`subSequence()`是`CharSequence`接口的方法,它可以应用于任何实现了`CharSequence`的类,如`StringBuilder`和`StringBuffer`。 7. **优化建议**: - 如果需要频繁操作...
除了`append()`方法,`StringBuilder`和`StringBuffer`还提供了`insert()`, `delete()`, `replace()`等方法来修改字符串。这些方法的实现都基于`AbstractStringBuilder`,在进行相应操作时,都会先检查并调整容量,...
#### 四、String与StringBuffer的操作方法 - **String**: - `charAt(int index)`:返回指定索引处的字符。 - `concat(String str)`:将当前字符串与另一个字符串连接起来。 - `indexOf(String str)`:返回指定...
而StringBuffer示例中,使用append方法实际上是在修改原有对象的内容,并且这种修改会反映在所有指向这个StringBuffer对象的引用上。 为了进一步理解二者的差异,我们可以通过String和StringBuffer的内存使用和操作...
它的内部机制与`String`类似,但是提供了`append()`和`insert()`等方法来改变字符串内容,而不会每次都创建新对象。例如: ```java StringBuffer sb = new StringBuffer("Hello"); sb.append(" World"); // 不会...
本文将深入探讨`StringBuffer`的用法,包括其常用方法,并通过实例对比`StringBuffer`与`String`的区别。 首先,我们来了解`StringBuffer`的核心特性。`String`类在进行字符串拼接时会创建新的对象,而`...
String, StringBuffer 与 StringBuilder 的区别 在 Java 中,String, StringBuffer 和 StringBuilder 三个类都是用于字符操作的,但它们之间有着很大的区别。 首先,String 是不可变类,意味着一旦创建了 String ...
StringBuffer 的截取功能包括 substring 方法,可以从指定位置截取到末尾或截取从指定位置开始到结束位置。 在实际开发中,我们经常需要将数组转换成字符串,可以使用 StringBuffer 的 append 方法来实现。例如,...
本文将从源码角度对StringBuilder和StringBuffer的异同进行详细的解析。 StringBuilder的特点 根据Java文档,StringBuilder是一个可变的字符序列,提供了与StringBuffer兼容的API,但是不保证同步。这意味着...
`StringBuffer`还提供了其他一些方法,如`insert()`, `delete()`, `replace()`, `length()`, `capacity()`, 和 `ensureCapacity()`等,用于在字符串中插入、删除、替换字符,以及调整和查询缓冲区容量。 总的来说,...
2. **追加内容**:使用 `append()` 方法可以将指定的内容添加到 `StringBuffer` 的末尾。 ```java sb.append("要追加的字符串"); ``` 3. **插入内容**:使用 `insert()` 方法可以在指定位置插入内容。 ```java ...
与不可变的`String`类不同,`StringBuffer`对象可以在创建后进行修改,这使得它非常适合在需要频繁修改字符串内容的应用场景中使用。 ### StringBuffer的特点 #### 1. 字符串缓冲区 `StringBuffer`可以被视为一个...